临键锁是记录锁与前方间隙锁的原子性封装,范围为左开右闭区间(如(5,10]),在rr隔离级别下,对非唯一索引等值查询或任何范围查询触发,既锁记录本身又锁其前一索引值到当前值之间的间隙。

临键锁(Next-Key Lock)不是记录锁和间隙锁的简单叠加,而是它们在特定场景下被 InnoDB 自动组合应用的一种锁行为,本质是“记录锁 + 前方间隙锁”的原子性封装,范围为左开右闭区间,比如 (5, 10]。
临键锁的构成逻辑
它锁定的是一个索引位置及其左侧的间隙:既防止别人修改/删除当前记录(靠记录锁),又防止别人在该记录前一个索引值到当前索引值之间插入新行(靠间隙锁)。例如索引中有值 5、10、15,那么对 10 执行临键锁,实际锁住的是区间 (5, 10] —— 包含记录 10 本身,也包含 (5,10) 这个空白区域。
什么情况下会触发临键锁
临键锁只在 可重复读(RR)隔离级别 下生效,且需满足以下条件:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 查询使用的是 非唯一索引(包括普通二级索引),或
- 使用 范围条件(如 >、
- 执行的是 锁定读(SELECT ... FOR UPDATE / LOCK IN SHARE MODE)或 写操作(UPDATE / DELETE)
与记录锁、间隙锁的协作关系
三者并非并列选择,而是根据查询条件和索引类型动态决定加哪种锁:
- 主键/唯一索引 + 等值查询(id = 100)→ 只加 记录锁(不锁间隙)
- 无匹配记录的唯一索引等值查询(id = 999,但不存在)→ 只加 间隙锁(锁 (5,10) 这类空档)
- 普通索引等值查询(name = 'Alice')→ 加 临键锁,即锁住匹配记录 + 它前面的间隙
- 范围查询(age > 25)→ 对扫描到的每个索引区间都加 临键锁,最终覆盖整个扫描范围及末尾间隙
为什么必须是“左开右闭”
这个设计避免了区间重叠和遗漏。比如索引值为 [10, 20, 30],临键锁生成的区间是 (-∞,10]、(10,20]、(20,30]、(30,+∞)。每个区间右端点是真实存在的记录,左端点是上一条记录(或边界),保证所有可能插入的位置都被覆盖,同时相邻区间无缝衔接,不重复也不留空。










