故障现象
ERROR 1213: Deadlock found when trying to get lockERROR 1205: Lock wait timeout exceeded; try restarting transaction- UPDATE/DELETE 语句长时间挂起
诊断步骤
- 查看当前锁等待
-- MySQL 8.0 SELECT * FROM performance_schema.data_lock_waits\G -- MySQL 5.7 SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query FROM information_schema.innodb_lock_waits w JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;
- 查看最近一次死锁详情
SHOW ENGINE INNODB STATUS\G -- 搜索 LATEST DETECTED DEADLOCK 段落
- Kill 阻塞源线程(紧急解锁)
KILL <blocking_thread_id>;
预防策略
- 保持事务短小,及时提交;避免在事务中交互式等待
- 多表操作时统一加锁顺序(如按 ID 从小到大)
- 对热点行使用
SELECT ... FOR UPDATE乐观/排队策略 - 合理设置
innodb_lock_wait_timeout(默认 50s,建议 10s)