hymn

忽有故人心头过,回首山河已是秋。

  menu
132 文章
0 浏览
0 当前访客
ღゝ◡╹)ノ❤️

MySQL 锁和隔离级别关系总结

MySQL的锁:

排他锁:读写,读读都不能并行

自增锁:表锁,主键是自增的话,会串行执行insert,后面的insert必须等待第一个事务完成

插入意向锁:如果insert 不是同一行的话,不会互相影响

记录锁(行锁):select会影响修改和删除本行,锁的是索引

间隙锁:锁间隙,防止select时修改间隙里面的数据(在RR下,防止出现幻读;RC的话会自动消失)

临隙锁,记录锁和间隙锁的结合,也是防止出现幻读,RC下也会自动消失

(1)记录锁锁定索引记录;

(2)间隙锁锁定间隔,防止间隔中被其他事务插入;

(3)临键锁锁定索引记录+间隔,防止幻读;

读脏: 读取到了没有提交的数据
不可重复读: 两次读取到的数据不一样(数据被修改)
幻读:两次读取到的结果集不一样(中间有插入或者删除数据)

MySQL四种隔离级别

读未提交:隔离级别最低,select不加锁,可能出现读脏
读提交:用的最多,可能出现幻读,除了外键约束和重复建检查封锁区间,都是记录锁。普通的select是快照读
可重复读:默认,会有间隙锁和临隙锁,锁住范围,防止不可重复读。普通的select是快照读
串行化:隔离级别最高,所有的select都会加share mode,会被update,delete互斥
**RR下,事务在第一个Read操作时,会建立Read View,读取到的和第一次读取到的数据一样。
	(解决了读脏数据,但是会出现幻读)
RC下,事务在每次Read操作时,都会建立Read View,读取到的都是提交后的最新数据。
    (解决了读脏数据和幻读,比RC是更高的隔离级别)**
**普通的select都是快照读,不会加锁,除非加上for update,
	1、当条件是id=1 for update,这种事记录锁,会锁住这一行,防止其他的事务改变删除他,
	2、当id between 10 and 15 for update,是间隙锁,会锁住间隙,防止其他事务修改范围内数据。
	2.1、以上是在RR隔离级别下,当隔离级别是RC时,间隙锁自动失效**
update 和 delete和select加锁差不多,也会有记录锁和间隙锁,只不过不用加for update
insert和他们不太一样,他有两个锁,
	一个是自增锁,是一个表锁,在一个insert没有成功时,其他insert都会阻塞
	一个是插入意向锁,不会阻止不同的主键的insert,
		比如
		insert id value(1)
		insert id value(2) 这两个可以并行执行
		但是
		insert id value(1)
		insert id value(1) 这两个会阻塞

标题:MySQL 锁和隔离级别关系总结
作者:hymn
地址:https://dxyhymn.com/articles/2020/06/24/1592993540449.html