关于Next-key lock的验证:主键范围查询的锁机制确认
主键范围查询的Next-Key Lock分析
针对你的查询语句:
SELECT * FROM table WHERE pk > 99;
(以下分析基于InnoDB默认的可重复读(RR)隔离级别)
- 核心规则:主键属于唯一索引,InnoDB对唯一索引的范围查询仍会触发Next-Key Lock(记录锁+间隙锁的组合),同时会针对唯一特性做优化
- 具体锁范围:
- 记录锁:锁定表中所有
pk > 99的主键记录,阻止其他事务对这些记录执行修改、删除操作 - 间隙锁:覆盖以下区间:
(99, 表中第一个大于99的主键值)的间隙- 所有后续主键记录之间的间隙(比如表中有pk=100、105,则包含
(100,105)) - 最后一条主键记录到
+∞的间隙
这些间隙锁会阻止其他事务在对应区间插入新的主键值(比如插入pk=102、115等)
- 记录锁:锁定表中所有
- 极端情况:若表中无任何
pk > 99的记录,间隙锁会直接锁定(99, +∞)的完整区间,禁止插入所有pk大于99的新记录
示意图验证参考
如果你的示意图符合以下判断标准,即为正确:
- 未对
pk <= 99的记录或其间隙加锁 - 包含了
(99, 首个大于99的pk值)的间隙锁 - 包含了所有后续pk记录间的间隙,以及最后一条pk到
+∞的间隙锁 - 对所有
pk > 99的记录标注了记录锁
若示意图不符合以上任意一点,即为错误。
内容的提问来源于stack exchange,提问作者user19481364
相关产品推荐
相关产品推荐

