Record Lock总是会去锁住主键索引记录,如果InnoDB存储引擎表在建立的时候没有设置任何一个主键或唯一非空索引,那么这时InnoDB存储引擎会使用隐式的
主键来进行锁定。
Next-Key Lock是结合了Gap Lock+Record Lock的一种锁定算法,在Next-Key Lock算法下,InnoDB对于行的查询都是采用这种锁定算法。假如一个索引有10,11
,13和20这4个值,那么该索引可能被Next-Key Locking的区间为:
(-无穷,10] ,(10,11], (11,13], (13,20], (20,+无穷)
采用Next-Key Lock的锁定技术称为Next-Key Locking。其设计的目的是为了解决幻读问题。而利用这种锁定技术,锁定的不是单个值,而是一个范围。 然而,
当查询的索引含有唯一属性时,InnoDB存储引擎会对Next-Key Lock进行优化将其降级为Record Lock,即仅锁住索引本身,而不是范围。下面演示一个例子。
mysql> create table t (a int primary key); Query OK, 0 rows affected (0.01 sec) mysql> insert into t select 1; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t select 2; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t select 5; Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0