使用说明
本页面包含三个交互模块:
- 表锁兼容性矩阵:点击单元格 / 选择两侧锁模式,立刻看到是否冲突
- 行锁兼容性:4 档行锁的兼容性查询
- 死锁形成动画:可控步进,观察两个事务如何把自己锁死
① 表锁兼容性
② 行锁兼容性
③ 死锁形成动画
表级锁 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 LOCKED | 9.5+ | 8.0+ |
| 咨询锁 | 会话/事务级 + 共享/排他,bigint key | GET_LOCK 仅会话级 + 命名锁 |
| 死锁错误码 | SQLSTATE 40P01 | 1213 / 40001 |