间隙锁
默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key 锁进行搜索和索引扫描,以防止幻读。
- 索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。
- 索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。
- 索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止。
注意:间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。
演示
数据库的表
索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁
执行更新id为88的数据
查看此时行锁和意向锁的情况:id为60和100之间加入的间隙锁
索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁
数据
-- 查询的条件为id>=19,并添加共享锁
select * from stu1 where age=3 lock in share mode;
查看意向锁及行锁的加锁情况
索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止
数据
执行的sql语句:
-- 查询的条件为id>=19,并添加共享锁
select * from stu1 where id>=19 lock in share mode;
查看意向锁及行锁的加锁情况