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

死锁日志解读与预防

SHOW ENGINE INNODB STATUS 的 LATEST DETECTED DEADLOCK 段记录最近死锁的事务与等待;根本对策是统一加锁顺序、缩短事务。

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

示例

示例
SHOW ENGINE INNODB STATUS\G
-- 关注 LATEST DETECTED DEADLOCK 段:两事务 SQL、持有锁与等待锁
-- 末尾 WE ROLL BACK TRANSACTION ... 表示被回滚(牺牲)的一方

-- 记录所有死锁到错误日志(排查期开启)
SET GLOBAL innodb_print_all_deadlocks = ON;
输出范围默认只保留最近一次;要看全部需打开 innodb_print_all_deadlocks
被回滚方InnoDB 选择代价较小的事务回滚,应用需捕获死锁错误并重试
预防事务内按固定顺序访问行;缩小事务范围;评估隔离级别与索引完备性

易错点

  • 把死锁当纯数据库问题:多数根因在应用访问行为(顺序、批量范围),要按 SQL 模式治理
  • 死锁后直接报错不重试:被选为牺牲的事务属于正常机制,应用侧需要幂等重试

数据来源与参考

  • MySQL 8.0 Reference Manual · InnoDB Deadlocks
  • MySQL 8.0 Reference Manual · SHOW ENGINE Statement
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌