首页/数据/数据库速查/临键锁与幻读防治(RR 语义)
性能与调优57 条

临键锁与幻读防治(RR 语义)

RR 默认用临键锁(记录+间隙)把范围条件锁成区间,防止其他事务插入新行(幻读);等值唯一命中时退化为记录锁。

数据库速查数据更新于 2026-10-12

行为示例

行为示例
-- 索引 (user_id),RR 隔离级别
BEGIN;
SELECT * FROM appdb.orders WHERE user_id = 100 FOR UPDATE;
-- user_id=100:命中记录 + 相邻间隙被锁
-- 另一事务 INSERT user_id=100 的行 => 阻塞
-- 无索引条件 => 全表记录+间隙都被锁(伪表锁效果)
锁范围命中记录 + 前方间隙(到下一记录)
退化唯一索引等值命中 → 仅记录锁
开关RC 级别下关闭大部分 gap 行为
gap lock 只在 RR 及以上且「当前读」(FOR UPDATE / 更新)时出现;快照读不加行锁。

易错点

  • 范围 FOR UPDATE 锁超过预期区间:相邻业务插入被莫名阻塞
  • 无索引的 FOR UPDATE:全表间隙锁,插入风暴即全库排队

数据来源与参考

  • MySQL 8.0 Reference Manual: Locking Reads
  • MySQL 8.0 Reference Manual: InnoDB Locking

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌