目标
批量更新偶发死锁,重跑即成功,说明问题在加锁顺序而非逻辑正确性。本配方读取 InnoDB 状态中的最近死锁段,查看两个事务各自持有的锁与牺牲者,确认加锁顺序相反;随后固定按主键排序加锁,消除循环等待,并在相同并发负载下验证死锁归零。
步骤要点
- 用 SHOW ENGINE INNODB STATUS 查看最近死锁。
- 开启 innodb_print_all_deadlocks 记录每次死锁。
- 固定按同一顺序加锁,必要时缩小 WHERE 范围减少间隙锁。
- 在相同并发负载下验证死锁消失。
SHOW ENGINE INNODB STATUS\G
排错提示
- 死锁信息很快被覆盖,需开启全量记录。
- 排序后仍可能因间隙锁死锁,需缩小范围。
- 一致排序能减少但无法完全消除死锁。
适用边界
- 输出冗长且随版本不同。
- 不评估应用层重试逻辑。