1. MySQL InnoDB 临键锁(Next-Key Lock),记录锁 + 间隙锁的组合?
MySQL InnoDB 的临键锁(Next-Key Lock)是什么?它为什么是记录锁与间隙锁的组合?
- 临键锁的构成
- 左开右闭区间
- 防止幻读的作用
临键锁(Next-Key Lock)是 InnoDB 在 REPEATABLE READ 级别下,对索引记录及其前面间隙加锁的机制,其锁定的区间是"左开右闭"的,即 (前一条记录, 当前记录]。它实际上是记录锁(Record Lock)与间隙锁(Gap Lock)的组合:既锁住索引记录本身,也锁住该记录之前的间隙。这样既能防止其他事务修改/删除这条记录,也能防止其他事务在该间隙插入新记录,从而防止幻读。示例:若索引值有 10、20、30,对 20 加临键锁实际锁定 (10, 20] 区间。
临键锁是 InnoDB 解决 RR 下幻读的加锁手段。它把"锁行"扩展到"锁区间",从根上阻断新记录插入到已锁定的范围,从而在加锁读层面保证结果集稳定。