什么是间隙锁
- 间隙锁(Gap Lock)是
Innodb
在可重复读提交下为了解决幻读问题时引入的锁机制,间隙锁只有在隔离级别为可重复读的情况下才会生效; - 锁加载两个索引之间(空闲空间),也可以是第一个索引之前,也有可能是最后一个索引之后;
什么是幻读?
- 事务 A 按照一定条件进行数据读取, 期间事务 B 插入了相同搜索条件的新数据,事务 A 再次按照原先条件进行读取时,发现了事务 B 新插入的数据,这种现象称为幻读;
为什么会产生幻读?
- 产生幻读的原因是行锁只能锁住行,但插入数据这个动作是要更新记录之间的间隙;
实际作用场景
- 假设student表有id,name两个字段,id为1,2,5;
- 客户端1执行sql:
update student set name = '张三' where id > 1 and id < 5;
(此时事务不提交) - 客户端2执行sql:
INSERT INTO student ( id, name) VALUES ( 3,'李四' );
(此时会发现此条sql会阻塞状态)
解析
- 当客户端1执行sql时,间隙锁会锁住id为 2,3,4的数据,虽然3,4数据为空,但也不可以执行插入操作(为了解决幻读);
- 当客户端1事务提交之后方可插入成功;
参考
- https://www.cnblogs.com/aspirant/p/9177978.html