【MySQL】深入理解MySQL锁和事务隔离级别
先看个小案例:
- 话不多说,上案例,先创建一个表
mysql> CREATE TABLE IF NOT EXISTS `account`( `id` INT UNSIGNED AUTO_INCREMENT, `name` VARCHAR(), `balance` INT() DEFAULT NULL, PRIMARY KEY (id))ENGINE=innodb charset=utf8mb4;
- 插入几条数据
mysql> insert into account(name,balance) values('lilei',);
Query OK, row affected (0.00 sec)
mysql> insert into account(name,balance) values('hanmei',);
Query OK, row affected (0.00 sec)
mysql> insert into account(name,balance) values('lucy',);
Query OK, row affected (0.00 sec)
- 此时可以看到三条数据:
mysql> select * from account;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| | lilei | |
| | hanmei | |
| | lucy | |
+----+--------+---------+
rows in set (0.00 sec)
- 我们开启两个命令行界面,然后实践一下
1》我们先在一个命令行(下面称为命令行A)中,执行一段事务操作,但是不提交
mysql> begin;
Query OK, rows affected (0.00 sec) mysql> update account set balance= where id=;
Query OK, row affected (0.07 sec)
Rows matched: Changed: Warnings: mysql> select * from account;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| | lilei | |
| | hanmei | |
| | lucy | |
+----+--------+---------+
rows in set (0.00 sec)
2》然后在另一个命令行(下面称为命令行B)中,进行一次修改操作:
mysql> update account set balance= where id =;
3》可以看到在命令行B中,并不会看到修改结构,因为命令行A中的事务会默认加上一个行锁,只要事务不停,行锁就一直保留:

4》此时我们在命令行A中进行提交,在命令行B中会看到提交返回:

5》但是命令行A提交了事务后,因为A本想将ID为3的用户【balance】修改为3000,可此时查看结果后发现:

6》所以此时A对ID为3的用户的修改未达到理想值
- 此处引申一点,由于MySQL的默认隔离级别是行锁,如何验证它是行锁呢:
- 我们在A中修改【ID=3】的数据,然后在B中修改【ID=2】的数据,可以明显看到有结果返回,由此可以证明,锁仅仅是加在行上的

此时我们言归正传:
- 事务与ACID属性:
原子性(Atomicity)、一致性(Consistent)、隔离性(Isolation)、持久性(Durable)
- 并发事务处理带来的问题:
》更新丢失:两个事务同事操作相同数据,后提交的事务会覆盖先提交的事务处理结果,通过乐观锁就可以解决。(即文章开篇介绍的案例) 》脏读:事务A读取到了事务B已经修改,但尚未提交的数据,如果事务B回滚,A读取的数据无效,不符合一致性。 》不可重读:事务A读取到了事务B已经提交的修改数据,不符合隔离性。 》幻读:事务A读取到了事务B提交的新增数据,不符合隔离性。
- 事务隔离级别:
- 常看数据库事务隔离级别:
mysql> show variables like 'tx_isolation';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
- 设置事务隔离级别:
mysql> set tx_isolation='REPEATABLE-READ';(其他三种:READ-UNCOMMITTED,READ-COMMITTED,SERIALIZABLE)

- 此时我们分别聊聊剩下的案例,为了方便验证,我们先把隔离级别设置到最低级:
mysql> set tx_isolation ='READ-UNCOMMITTED';
1》脏读,不废话,直接上实例:

分析一下,上述指令,我们按顺序执行,可以看出因为事务B(右面)最后进行了回滚操作,但是事务A(左面)两次执行结果并不一样,造成了脏读情况。
2》不可重读,也不废话,线上案例:

分析来看,上述指令情况使得原子的一致性和隔离性均未实现,因为事务A还没有结束,所以两次所读数据应该一致,才可以保证事务实现一致性和隔离性。
3》幻读,先不墨迹,看案例就完了:

事务A一直处在一个事务内,但事务B缺新增了数据并提交了,而事务A两次查询结果不一致,从而该情况叫幻读。
- 数据库默认隔离级别是【可重复度】,但是并没有解决【幻读】情况,请问为什么不使用【可串行化】呢?
因为【可串行化】的性能非常低,如果一个商城,开了【可串行化】的级别后,下个订单却要一分钟,这种用户体验你会接受么^ - ^
【MySQL】深入理解MySQL锁和事务隔离级别的更多相关文章
- 面试必问的MySQL锁与事务隔离级别
之前多篇文章从mysql的底层结构分析.sql语句的分析器以及sql从优化底层分析, 还有工作中常用的sql优化小知识点.面试各大互联网公司必问的mysql锁和事务隔离级别,这篇文章给你打神助攻,一飞 ...
- (转)SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)
五.锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...
- SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)
五.锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...
- 深入理解mysql锁与事务隔离级别
一.锁 1.锁的定义 锁即是一种用来协调多线程或进程并发使用同一共享资源的机制 2.锁的分类 从性能上分类:乐观锁和悲观锁 从数据库操作类型上分类:读锁和写锁 从操作粒度上分类:表锁和行锁 2 ...
- MySql锁和事务隔离级别
在讲mysql事物隔离级别之前,我们先简单说说mysql的锁和事务. 一:数据库锁 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对同一张表进行操作,比如有的在读取该行数据,其他的尝试去 ...
- Mysql中的读锁,写锁,乐观锁及事务隔离级别和并发问题
mysql读锁,写锁,乐观锁 读锁,也叫共享锁(shared lock) SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE 写锁,也叫排他 ...
- MySQL锁与事务隔离级别
一.概述 1.锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.IO等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并发访 ...
- oracle,mysql,sql server三大数据库的事务隔离级别查看方法
1:mysql的事务隔离级别查看方法 mysql 最简单,执行这条语句就行:select @@tx_isolation 详情: 1.查看当前会话隔离级别 select @@tx_isolation; ...
- SQL Server中锁与事务隔离级别
SQL Server中的锁分为两类: 共享锁 排它锁 锁的兼容性:事务间锁的相互影响称为锁的兼容性. 锁模式 是否可以持有排它锁 是否可以持有共享锁 已持有排它锁 否 否 已持有共享锁 否 是 SQL ...
随机推荐
- java 之 继承 super关键籽 this关键字 final关键字
继承 语法: 使用 extends 来继承 class子类 extends父类{ 子类属性 子类方法 } 继承的特点: 1.子类会把父类所有的属性和方法继承下来,final修饰的类是不可以被继承 ...
- java之 惰性初始化
class Soap { private String s; Soap(){ System.out.println("Soap()"); s="Constructed&q ...
- 【Linux常见命令】sort命令
sort - sort lines of text files sort命令用于将文本文件内容加以排序. sort可针对文本文件的内容,以行为单位来排序. 语法: sort [OPTION]... [ ...
- H3C配置Web登陆
为什么80%的码农都做不了架构师?>>> 1.开启http服务. [H3C]ip http enable 2.创建web登陆的用户. [H3C]local-user king / ...
- U-Mail邮件系统详解邮件收发延迟原因及解决方案
邮件是现代社会办公最常见.最频繁的通联工具,但使用邮件系统时,用户普遍最关心两个安全,一个是安全性,邮件会不会被窃密?自己的邮箱账号会不会被盗取被攻占呢?保存的数据会不会丢失呢?关于这个问题,国内知名 ...
- 从零搭建分布式文件系统MinIO比FastDFS要更合适
前两天跟大家分享了一篇关于如何利用FastDFS组件来自建分布式文件系统的文章,有兴趣的朋友可以阅读下<用asp.net core结合fastdfs打造分布式文件存储系统>.通过留言发现大 ...
- STL下<algorithm>下的reverse函数
定义: reverse用于C++中,对给定区间所有元素进行排序,是一种反向函数,不具备排序功能.sort函数包含在头文件为#include<algorithm>的C++标准库中. 语法: ...
- layui里面的layer模块弹窗,强制居中的方法!!!
每次调用layer弹窗做动态展示的时候,只要内容不固定或者需要二次渲染 比如layui.form.render()进行渲染的时候 由于弹窗已经出来了,只是content部分的结构改变了宽度或者高度,l ...
- 微信小程序使用GoEasy实现websocket实时通讯
不需要下载安装,便可以在微信好友.微信群之间快速的转发,用户只需要扫码或者在微信里点击,就可以立即运行,有着近似APP的用户体验,使得微信小程序成为全民热爱的好东西~ 同时因为微信小程序使用的是Jav ...
- 基于C语言的Q格式使用详解
用过DSP的应该都知道Q格式吧: 目录 1 前言 2 Q数据的表示 2.1 范围和精度 2.2 推导 3 Q数据的运算 3.1 0x7FFF 3.2 0x8000 3.3 加法 3.4 减法 3.5 ...