PostgreSQL 锁机制 · 交互演示

表锁 8 种兼容性矩阵 · 行锁 4 档 · 死锁形成动画

使用说明

本页面包含三个交互模块:

  1. 表锁兼容性矩阵:点击单元格 / 选择两侧锁模式,立刻看到是否冲突
  2. 行锁兼容性:4 档行锁的兼容性查询
  3. 死锁形成动画:可控步进,观察两个事务如何把自己锁死
① 表锁兼容性
② 行锁兼容性
③ 死锁形成动画

表级锁 8 种模式两两兼容性

已持有: 请求: 点选两边或单元格查看结果
✓ = 兼容(请求立即获得)   ✗ = 冲突(请求阻塞等待)   口诀:ACCESS EXCLUSIVE 跟所有人冲突;ACCESS SHARE 几乎跟所有人和睦。

行级锁 4 档强度兼容性

FU = FOR UPDATE,FNKU = FOR NO KEY UPDATE, FS = FOR SHARE,FKS = FOR KEY SHARE。
普通 UPDATE 修改非键列时隐式持有 FNKU;SELECT 不持有任何行锁。

典型行锁场景

  • SELECT ... FOR UPDATE:经典悲观锁,准备做"删行 / 改主键"
  • SELECT ... FOR UPDATE NOWAIT:拿不到立即报错
  • SELECT ... FOR UPDATE SKIP LOCKED:任务队列消费神器
  • SELECT ... FOR SHARE:多事务都能读,但禁止更新
  • SELECT ... FOR KEY SHARE:仅锁主键,外键引用时隐式持有

死锁形成动画

点击「下一步」逐步推进;观察两个事务如何把自己锁死,PG 在 ~1s 后自动检测并回滚 victim。

事务 A
空闲
事务 B
空闲
行 1
行 2

📌 与 MySQL 的对比速查

维度 PostgreSQL MySQL InnoDB
表锁种类8 种4 种 (IS/IX/S/X)
行锁种类4 种 (FU/FNKU/FS/FKS)2 种 (X/S)
行锁实现在元组 xmax 字段内存锁哈希表
间隙锁无 (靠 SSI 防幻读)有 Next-Key Lock
SKIP LOCKED9.5+8.0+
咨询锁会话/事务级 + 共享/排他,bigint keyGET_LOCK 仅会话级 + 命名锁
死锁错误码SQLSTATE 40P011213 / 40001