MySQL 的临键锁(Next-Key Locks)
临键锁是一条索引记录上的记录锁与该索引记录之前的间隙上的间隙锁的结合体。
InnoDB
引擎执行行级锁的方式是,在搜索或扫描表索引时,它会对遇到的索引记录设置共享锁或排他锁。因此,行级锁实际上是索引记录锁。索引记录上的临键锁也会影响该索引记录之前的「间隙」。也就是说,临键锁是索引记录锁加上索引记录前面的间隙上的间隙锁。如果一个会话对索引中的记录R
具有共享锁或排他锁,则另一个会话无法在索引顺序中紧靠 R
之前的间隙中插入新的索引记录。
假设一条索引包含 10、11、13 和 20 这几个值, 那么该索引的可能的临键锁覆盖以下间隙。其中圆括号表示排除该间隙点,方括号表示包括该间隙点:
(负无穷大, 10]
(10, 11]
(11, 13]
(13, 20]
(20, 正无穷大)
对于最后一个间隙,临键锁锁定索引中最大值以上的间隙,并且具有高于索引中实际任何值的「上限」伪记录。由于上限不是真正的索引记录,因此,实际上,这个临键锁只锁定了最大索引值之后的间隙。
默认情况下, InnoDB
引擎使用 可重复读 作为事务隔离级别。但在本例中, InnoDB
引擎使用临键锁进行搜索和索引扫描,这样可以防止产生幻行( 请参阅第 14.7.4 节,,「幻行」)。
临键锁(Next-Key Locks)的事务数据类似于 SHOW ENGINE INNODB STATUS
, InnoDB 监视器 会输出以下内容:
RECORD LOCKS space id 58 page no 3 n bits 72 index `PRIMARY` of table `test`.`t`
trx id 10080 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
0: len 8; hex 73757072656d756d; asc supremum;;
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
0: len 4; hex 8000000a; asc ;;
1: len 6; hex 00000000274f; asc 'O;;
2: len 7; hex b60000019d0110; asc ;;
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: