首页/数据/SQL 速查/间隙锁(Gap Lock)与幻读抑制
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

间隙锁(Gap Lock)与幻读抑制

InnoDB 在 REPEATABLE READ 下用 next-key 锁(记录锁+间隙锁)锁住范围,防住别的事务在区间内插入;PostgreSQL 没有间隙锁。

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

MySQL 示例

MySQL 示例
BEGIN;
SELECT * FROM orders
WHERE id BETWEEN 100 AND 200
FOR UPDATE;
-- 其它事务在该区间的 INSERT 会被阻塞(间隙被锁)
COMMIT;
InnoDB范围锁读/部分写会锁间隙;等值条件也会锁相邻间隙(取决于索引)
PostgreSQL仅行级锁 + 快照;幻读由快照与 SSI(串行化)处理
影响间隙锁提高并发正确性,也更容易与其他事务相互等待

易错点

  • 把 MySQL 的间隙锁心智带到 PostgreSQL:PG 不因范围查询阻塞插入,并发逻辑要重新验证
  • 非索引条件加 FOR UPDATE 会扩大锁定范围(可能近似锁全表),锁读前先看执行计划

数据来源与参考

  • MySQL 8.0 Reference Manual · InnoDB Locking
  • PostgreSQL Documentation · Explicit Locking
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌