← 中文资源

简体中文版本

检测 MySQL 锁等待与死锁模式

解读 InnoDB 锁等待与死锁诊断,找出总是以相反顺序加锁的事务。

阅读英文原文

目标

批量更新偶发死锁,重跑即成功,说明问题在加锁顺序而非逻辑正确性。本配方读取 InnoDB 状态中的最近死锁段,查看两个事务各自持有的锁与牺牲者,确认加锁顺序相反;随后固定按主键排序加锁,消除循环等待,并在相同并发负载下验证死锁归零。

步骤要点

  1. 用 SHOW ENGINE INNODB STATUS 查看最近死锁。
  2. 开启 innodb_print_all_deadlocks 记录每次死锁。
  3. 固定按同一顺序加锁,必要时缩小 WHERE 范围减少间隙锁。
  4. 在相同并发负载下验证死锁消失。
SHOW ENGINE INNODB STATUS\G

排错提示

  • 死锁信息很快被覆盖,需开启全量记录。
  • 排序后仍可能因间隙锁死锁,需缩小范围。
  • 一致排序能减少但无法完全消除死锁。

适用边界

  • 输出冗长且随版本不同。
  • 不评估应用层重试逻辑。