MySQL间隙锁

SERIALIZABLE可串行化如何解决幻读

第一类条件:范围查询

第二类条件:等值查询

record lock:行锁

gap lock

next-key lock:record lock + gap lock

实例1:范围查询解决幻读

两个会话都设置手动提交 autocommit=0,并且事务处于SERIALIZABLE级别

会话2做范围查询获得行锁:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dq0qPGlu-1686828962949)(MySQL间隙锁.assets/image-20230615193034936.png)]

此时会话1想要插入数据要获取排他锁(X锁)会阻塞

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L9sGwD22-1686828962950)(MySQL间隙锁.assets/image-20230615193134270.png)]

这是因为会话2中id为 13之前的一个间隙,1314,14无穷的 间隙 也加上了S锁,即gap lock 。所以我们往后插入记录失败(要获取X锁)。同理id为13与14间插入删除数据也会失败。这样就解决了幻读问题

等值查询时的间隙锁

等值查询时,会在查到的记录加上行锁(record lock),以及前后间隙加上间隙锁(gap lock),这两个锁合称 next-key lock

注解

如果有个会话查询用到全表扫描,那么就变成获得了表锁,其他会话都无法对该表进行读写操作。

表字段为辅助索引时(值可重复),会加 record lock + gap lock,即两边不能插入

表字段若为主键索引或唯一索引时(值不重复),则只加 record lock,两边能插

你可能感兴趣的:(MySQL,mysql,数据库)