以下是对 Next-Key Lock 及其作用的具体介绍:
一、什么是 Next-Key Lock?
1、基本概念:Next-Key Lock 是 MySQL InnoDB 存储引擎在可重复读(Repeatable Read)隔离级别下默认使用的锁机制。它是一种复合锁,由以下两部分组成:
记录锁(Record Lock):锁定索引记录本身,防止其他事务对该记录进行更新或删除操作。
间隙锁(Gap Lock):锁定索引记录之间的间隙,防止其他事务在这个间隙中插入新的记录。
2、核心特性
前开后闭区间:加锁的基本单位是 “前开后闭” 的区间。
动态触发:仅当查询或操作访问到特定对象时才会加锁。
与 MVCC 协同:结合多版本并发控制(MVCC),减少读写冲突。
二、Next-Key Lock 的作用
1、防止幻读
问题背景:幻读指同一事务内多次执行相同查询时,因其他事务插入新记录导致结果集不一致。
解决方案:通过锁定索引记录及其前后间隙,禁止其他事务在范围内插入新记录,从而保证事务的一致性。
2、确保范围查询的一致性
实现方式:当执行范围查询(如 WHERE age > 30 FOR UPDATE)时,Next-Key Lock 会锁定查询范围内的所有记录及其间隙,阻止其他事务插入或修改该范围内的数据。
示例:若表中存在年龄为 35 和 40 的用户,执行上述查询会锁定这两条记录及它们之间的间隙,防止插入年龄为 32 的新用户。
3、支持事务隔离性
隔离级别关联:作为可重复读隔离级别的核心机制,Next-Key Lock 确保事务在执行期间不受其他事务插入操作的影响,从而维护数据的一致性。
4、优化特定场景的性能
唯一索引优化:若查询条件命中唯一索引,Next-Key Lock 可退化为行锁,降低锁粒度。
向右遍历优化:对于等值查询,若最后一个值不满足条件,则仅施加间隙锁而非记录锁。
总的来说,Next-Key Lock 通过结合记录锁和间隙锁,有效防止了幻读现象的发生,确保了事务的一致性。它在可重复读隔离级别下起着至关重要的作用,特别是在处理范围查询时能够确保查询结果的稳定性。然而,使用时也需要注意其带来的性能影响和潜在的死锁风险。