遇到过 MySQL 死锁吗?怎样排查?
先自己想一想,再看参考要点
参考要点
- 常见原因:两个事务按相反的顺序更新同一组行,或者“先查有没有,没有再插入”时拿到了同一个间隙锁,插入意向锁与对方的间隙锁冲突
- InnoDB 检测到死锁后回滚其中一个事务,应用要重试
- 排查:看 SHOW ENGINE INNODB STATUS 的 LATEST DETECTED DEADLOCK,打开 innodb_print_all_deadlocks 记录每次死锁,锁等待时查 performance_schema.data_locks 和 data_lock_waits
- 避免:按相同顺序访问行、缩短事务、给条件列建索引、靠唯一索引判重