加载中...
Next-Key 锁是 InnoDB 在可重复读隔离级别下使用的一种行锁,它是记录锁与间隙锁的组合,同时锁定一条索引记录及其之前的间隙。这种设计能有效防止幻读,保证范围查询的可串行化效果。

| 类型 | InnoDB 行锁 |
| 构成 | 记录锁 + 间隙锁 |
| 生效隔离级别 | 可重复读 |
| 主要作用 | 防止幻读 |
Next-Key 锁(临键锁)是 InnoDB 存储引擎在可重复读隔离级别下采用的一种锁,它由记录锁与间隙锁组合而成,同时锁住某条索引记录本身以及该记录之前的开区间间隙。它的核心目的是在防止并发插入新行的同时,消除范围查询中的幻读。
行锁只能锁住已存在的记录,无法阻止其他事务在记录之间的空隙插入新行,这正是幻读的根源。间隙锁锁住的是记录之间的区间,阻止插入。Next-Key 锁把记录锁与其前一个间隙合并为一个锁定单元,对索引进行扫描时逐个加锁,从而覆盖整个范围,使可重复读下的范围读取表现得如同串行执行。
Next-Key 锁作用于可重复读下的当前读(如加锁查询、更新、删除)与范围条件场景。例如对某价格区间的记录执行加锁查询或批量更新时,InnoDB 会用临键锁封锁该区间,防止并发事务插入落在区间内的新记录。
问:Next-Key 锁是不是死锁的常见来源?答:是的,由于它会锁定间隙,不同事务以不同顺序访问相邻范围时容易互相等待而死锁,应尽量缩小加锁范围并统一访问顺序。
问:降低隔离级别能避免临键锁吗?答:在读已提交隔离级别下,InnoDB 大多不再使用间隙锁,从而不加临键锁,但也就不再依赖它防止幻读,需权衡一致性与并发。

| 类型 | InnoDB 行锁 |
| 构成 | 记录锁 + 间隙锁 |
| 生效隔离级别 | 可重复读 |
| 主要作用 | 防止幻读 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧