MySQL关于临键锁区间的疑问

测试环境

MySQL5.7.37 Innodb RR

数据

主键:id
rank:普通索引

疑问

当事务1:

select * from schools where rank=26 for update;

按照教程的意思是会锁住一个左开右闭的区间,也就是(24,32],但是为啥我insert…rank=24被阻塞,而type=32却没有堵塞。我想确认一下(24,32]是24< x <= 32的意思吧?所以按照我的理解不是应该插入rank=24时不被阻塞吗?为啥反过来了?是我操作的问题吗?

让PHP再次伟大
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

等值查询:针对非唯一索引等值查询,查询的记录不存在,则加 next-key lock,但会退化为Gap Lock间隙锁,即只会加一把锁。

1.加锁查询rank=26的记录,先会对普通索引 rank 加上 next-key lock,范围是(24,32]

2.由于查询的记录不存在,所以不会再额外加个间隙锁,但next-key lock 会退化为间隙锁,最终加锁范围是 (24,32)

针对上区间边界值24,如果新插入的数据rank值也是24,则其插入的主键id必须小于rank=24所对应的id值 2,也就是说 主键id<2 的可以插入, 否则插入失败。你如果插入时id使用的是自增id,那id肯定是大于2的,所以插入失败

同理,针对下区间边界值32,如果新插入的数据rank值也是32,则其插入的主键id必须大于rank=32所对应的id值 4,也就是说 主键>4 的可以插入, 否则插入失败。你如果插入时id使用的是自增id,那id肯定是大于4的,所以插入成功

根本原因是查询的记录不存在。详细参考:blog.csdn.net/w15558056319/article...

1年前 评论
win27149 (作者) 1年前
win27149 (作者) 1年前
勇敢的心 (楼主) 1年前
win27149 (作者) 1年前
讨论数量: 6

等值查询:针对非唯一索引等值查询,查询的记录不存在,则加 next-key lock,但会退化为Gap Lock间隙锁,即只会加一把锁。

1.加锁查询rank=26的记录,先会对普通索引 rank 加上 next-key lock,范围是(24,32]

2.由于查询的记录不存在,所以不会再额外加个间隙锁,但next-key lock 会退化为间隙锁,最终加锁范围是 (24,32)

针对上区间边界值24,如果新插入的数据rank值也是24,则其插入的主键id必须小于rank=24所对应的id值 2,也就是说 主键id<2 的可以插入, 否则插入失败。你如果插入时id使用的是自增id,那id肯定是大于2的,所以插入失败

同理,针对下区间边界值32,如果新插入的数据rank值也是32,则其插入的主键id必须大于rank=32所对应的id值 4,也就是说 主键>4 的可以插入, 否则插入失败。你如果插入时id使用的是自增id,那id肯定是大于4的,所以插入成功

根本原因是查询的记录不存在。详细参考:blog.csdn.net/w15558056319/article...

1年前 评论
win27149 (作者) 1年前
win27149 (作者) 1年前
勇敢的心 (楼主) 1年前
win27149 (作者) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!