Next-Key 可以理解为一种特殊的间隙锁,也可以理解为一种特殊的算法。通过临建锁可以解决特殊情况下的幻读问题。 先把会出现幻读记录for update即可利用临建锁解决。还有读提交级别没有间隙锁,只有行锁!!!
每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左闭右开区间的数据。需要强调的一点是,InnoDB 中行级锁是基于索引实现的。生效:for update 或者时 update。注意insert 数据时不会触发的!!!!因为插入不是触发幻读的因果
间隙锁范围
图中的age字段为普通索引
(-∞, 1],[2],[3],[4],
(10, 18],
(18, +∞]
临键锁只与非唯一索引列有关。在唯一索引列(包括主键列)上不存在临键锁,但是在唯一索引(包括主键,如上图的id)for update 一条不存在的id的话,也会触发间隙锁,看这个id条件在落在哪个范围,这个范围就会被锁住。这一项很重要!!!