Bug #118172 猜测间隙锁可以加到普通索引上,导致只能防止插入操作而不能防止select ...for update操作
Submitted: 13 May 3:54 Modified: 13 May 7:22
Reporter: hui wu Email Updates:
Status: Analyzing Impact on me:
None 
Category:MySQL Server: Command-line Clients Severity:S3 (Non-critical)
Version:8.0.31 OS:Windows
Assigned to: MySQL Verification Team CPU Architecture:x86 ( x86_64)
Tags: gap locks

[13 May 3:54] hui wu
Description:
猜测间隙锁可以加到普通索引上,导致只能防止插入操作而不能防止select ...for update操作。

How to repeat:
设置select ...for update 语句的查询条件是普通索引+RR隔离级别。
复现过程请参考:https://fcneheqzlq8n.feishu.cn/wiki/JS0mwvniwiMAnSkUeivcJg5Tngf#share-HmJxd55cNolfgqx2Wtac...

Suggested fix:
请问这是否是bug?因为根据网上搜到的绝大多数资料都是显示间隙锁是加在两个索引之间而不能加到索引本身上的。因为Record锁 本身可以防止insert操作(已在隔离级别为 READ COMMITED 中实验过),这和Gap 锁防止insert操作的定位重复了,导致Next-key 锁并不完全等同于Record锁+Gap锁(因为你不能根据Next-key锁反推出Record锁和Gap锁分别是什么)。

这一点使我十分困扰,希望能够在文档上分清楚这些概念,否则排除死锁问题时可能会因为概念上的混淆浪费大量的时间。