直接回答:排查靠 SHOW ENGINE INNODB STATUS 的 LATEST DETECTED DEADLOCK 段(可开 innodb_print_all_deadlocks 记日志),它列出各事务持有与等待的锁及对应 SQL;MySQL 8 还可用 performance_schema.data_lock_waits 看实时等待链。InnoDB 默认开启死锁检测,会自动回滚代价小的事务。
展开解析:解决与预防:
- 统一加锁顺序:多行/多表更新按固定顺序访问,消除循环等待。
- 缩短事务、尽快提交;大事务拆小。
- WHERE 必须走索引,否则大范围加锁,死锁温床。
- 降为 RC 隔离级别可去掉间隙锁,显著降死锁(配 binlog row 格式)。
- 应用捕获 1213 错误后有限重试,是标准兜底。
追问方向:双事务交叉更新的死锁复现、间隙锁导致的死锁案例。