Mysql 8的四种隔离级别以及对应不同类型的锁
作者:互联网
文章目录
1. MySql 8的四个隔离级别
第一级别:read-uncommitted:
- 有脏读,不可重复读,幻读的问题。
第二级别:read-committed:
- 有不可重复度,幻读的问题。
第三级别:repeatable-read(可重复读):
- 有幻读问题。
repeateable-read级别只限制了增删改,并没有限制查询操作。
第四级别:serializable(串行化):
-
一开始不会阻塞查询(多个事务可以同时进行查询)。当其中一个事务要执行增删改就会触发可串行化,触发后会对增删改查都串行化,一旦串行化就是,事务之间的操作就会出现事务阻塞。
-
这里的事务阻塞之间的一些增删改查操作是由时间限制的,超过一定时间就会报错,来重启事务。
举个例子:
在第四级别中,有两个a,b事务,两个事务之间进行查询操作是不会变化的!查询操作是不会被事务阻塞的!
但是,如果其中有一个事务进行了增删改的操作,例如:事务a进行了update操作。就会触发串行化的机制。
这样事务a的update操作就会被卡住,要等到事务b提交事务后,事务a才能继续执行。如果期间事务b又进行了update的操作,因为串行化后会有表级锁,锁住!因此不能执行其他增删改操作,就会报错!
如果事务b进行了提交,那么事务a的update就会进行操作了。但是因为串行化已经被触发,之后执行查询操作也会被事务阻塞!
上面的过程多处涉及到锁的内容!
2. 不同类型的锁
锁的分类:
一般可以分为两类,一个是悲观锁,一个是乐观锁,悲观锁一般就是我们通常说的数据库锁机制,乐观锁一般是指用户自己实现的一种锁机制。
-
悲观锁:它对于数据被外界修改持保守态度,认为数据随时会修改,所以整个数据处理中需要将数据加锁。悲观锁一般都是依靠关系数据库提供的锁机制,事实上关系数据库中的行锁,表锁不论是读写锁都是悲观锁。
-
乐观锁:顾名思义,就是很乐观,每次自己操作数据的时候认为没有人回来修改它,所以不去加锁,但是在更新的时候会去判断在此期间数据有没有被修改。
悲观锁按照使用性质划分:
-
共享锁(Share locks简记为S锁):也称读锁,事务A对对象obj加共享锁,其他事务也只能对obj加共享锁,多个事务可以同时读,但不能有写操作,直到A释放共享锁。
-
排它锁(Exclusivelocks简记为X锁):也称写锁,事务A对对象obj加排它锁以后,其他事务不能对obj加任何锁,只有事务A可以读写对象obj直到A释放排它锁。
-
更新锁(简记为U锁):用来预定要对此对象施加排它锁,它允许其他事务读,但不允许再施加更新锁或排它锁;当被读取的对象将要被更新时,则升级为排它锁,主要是用来防止死锁的。
悲观锁按照作用范围划分:
-
行锁:锁的作用范围是行级别,数据库能够确定那些行需要锁的情况下使用行锁,如果不知道会影响哪些行的时候就会使用表锁。
-
表锁:锁的作用范围是整张表。
还有一个页锁,不常用。
3. 四个级别 对应的不同的锁
为了权衡『隔离』和『并发』的矛盾,ISO定义了四个事务的隔离级别,每个级别的隔离程度不同,允许出现的副作用也不同
- 未提交读(read-uncommitted):最低级别,只能保证持久性
- 已提交读(read-committed):语句级别
- 可重复读(repeatable-read):事务级别
- 串行化(serializable):最高级别,事务与事务完全串行化执行,毫无并发可言,性能极低。
我们说这个mysql的前提是使用的InnoDB类型mysql数据库:
锁机制:阻止其他事务对数据,各个隔离级别主要体现在读取数据时加的锁和释放时机
- read-uncommitted(简称:RU):这里查询不加锁,但是增删改加了行级共享锁,直到事物被提交或回滚才会解锁。
- read-committed(简称:RC):事务读取的时候,查询操作不会加锁。进行增删改时,会加行级共享锁,直到事物被提交或回滚才会解锁。
- repeatable-read(简称:RR):事务读取时加行级共享锁,直到事务结束才会释放。
- serializable(简称:SE):事务读取时加表级排它锁,直到事务结束时,才释放。这里因为有一个串行化的一种状态,未触发前只可以进行查询操作,一旦进行增删改串行化就会被触发,增删改查都会被事务阻塞!
4. 如何测试每个隔离级别使用的什么锁?
我们可以自己创建两个cmd窗口命令,set autocommit = 0;关闭自动提交,使用start transaction或直接启动一个select语句都可以开启一个事务。
这样我们就可以模拟一下上面的流程效果了。
每次测试前,我们都可以进行一个commit;事务提交。
以下是通过sql命令常用的命令:
- strat transaction; 开启事务。
- commit;提交事务, rollback;回滚事务。
- show variables like ‘%auto%’; 查看提交状态命令。
- set autocommit = 0; 关闭自动提交。
- select @@transaction_isolation; 或 show variables like ‘transaction_isolation’;查看隔离级别。
- set session transaction isolation level 隔离级别; 修改隔离级别。
-- 修改级别的mysql语句:
set session transaction isolation level Repeatable Read;
5. 有关事务相关的文档内容总结
标签:事务,隔离,read,Mysql,增删,串行化,级别,四种 来源: https://blog.csdn.net/IT_Holmes/article/details/122641669