首页/数据/SQL 速查/死锁的原理与应对
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

死锁的原理与应对

两个事务互相持有对方需要的锁形成环路:InnoDB 与 PostgreSQL 都会自动检测并回滚其中一个事务,应用侧必须能重试。

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

检测手段

检测手段
-- MySQL:查看最近一次死锁
SHOW ENGINE INNODB STATUS\G

-- PostgreSQL:日志中记录 deadlock detected(错误码 40P01)
MySQL自动检测立即回滚代价较小的事务,报错 ER_LOCK_DEADLOCK (1213)
PostgreSQL等待 deadlock_timeout(默认 1s)后检测,报 40P01
预防统一加锁顺序、缩短事务、让加锁谓词走索引减少锁定范围

易错点

  • 把死锁当偶发故障忽略:不实现重试逻辑时,高峰期业务会以随机报错的形式抖动
  • 两个事务更新多行时行序不同就易死锁,批量更新按主键排序可显著降低概率

数据来源与参考

  • MySQL 8.0 Reference Manual · Deadlocks
  • PostgreSQL Documentation · Deadlocks
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌