Next-Key Locks 是记录锁(record lock)与间隙锁(gap lock)的结合。
记录锁是行级别的锁(row-level locks),当InnoDB 对索引进行搜索或扫描时,会在索引对应的记录上设置共享或排他的记录锁。而索引对应记录上的Next-Key Locks不但锁定记录本身,还会此记录之前的“间隙”。也就是说,next-key 锁结合了记录锁,及记录前面间隙上的gap lock。如果一个会话获取了索引对应记录 R 上的共享或排他锁,则另一个会话不能在R 之前(按索引排序)的间隙中插入新的记录。
假设有一个索引,包含的值为 10、11、13 和 20。next-key lock可能的锁定范围如下,其中圆括号表示排除区间端点,方括号表示包含端点:
(negative infinity, 10]
(10, 11]
(11, 13]
(13, 20]
(20, positive infinity)
negative / positive infinity 并不是实际存在的值,而是代表数据表的边界,仅仅是为了便于表示数据表最小索引之前 / 最大索引之后的间隙。
翻译自官网:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-next-key-locks