MySQL死锁排查实战指南:掌握SHOW ENGINE INNODB STATUS分析死锁日志技巧,快速定位循环等待问题。详解索引缺失、事务过大、执行顺序不一致三大死锁根源,提供缩短事务、降低隔离级别、加锁超时等终极解决方案。内含面试应答模板和2025年Java面试宝典资源,助你轻松应对MySQL死锁调优难题。附赠面试鸭会员返利福利,技术提升还能省钱!
想象一个场景:事务A锁定了行1,请求行2;事务B锁定了行2,请求行1——这就是经典的循环等待死锁。MySQL会自动检测死锁并回滚代价较小的事务(通过innodb_deadlock_detect=on
),但实际生产环境的死锁往往比这复杂得多。
直接执行 SHOW ENGINE INNODB STATUS
,重点看 LATEST DETECTED DEADLOCK 部分。比如在一次面试中,面试官就让我现场解析这段日志:
*** (1) TRANSACTION:
TRX_ID 12345, UPDATE table_a SET ... WHERE id=1
*** (2) TRANSACTION:
TRX_ID 67890, DELETE FROM table_a WHERE id=2
*** WE ROLL BACK TRANSACTION (2)
关键信息提取:
lock_mode X
表示排他锁)space id 456 page no 3
指向具体数据页)根据日志中的SQL,用脚本模拟并发操作。例如:
# 终端1
BEGIN;
UPDATE orders SET amount=100 WHERE user_id=1; -- 锁住user_id=1
# 终端2
BEGIN;
UPDATE orders SET amount=200 WHERE user_id=2; -- 锁住user_id=2
UPDATE orders SET amount=150 WHERE user_id=1; -- 等待终端1的锁
此时在终端1执行 UPDATE ... WHERE user_id=2
就会立刻触发死锁!
根据我的踩坑经验,90%的死锁由以下原因导致:
| 问题类型 | 典型案例 | 解决方案 |
|------------------|--------------------------|----------------------|
| 索引缺失 | WHERE条件无索引导致锁全表 | 添加联合索引 |
| 事务过大 | 单个事务更新500+行 | 拆分事务+分批提交 |
| 执行顺序不一致| 不同业务代码中UPDATE顺序相反 | 强制统一操作顺序 |
innodb_lock_wait_timeout=5
(单位:秒)💡 插播福利:如果你正在准备面试,推荐使用2025年Java面试宝典(提取码:9b3g),涵盖MySQL调优、分布式锁等高频考点。
当面试官问“实际项目中如何解决死锁?”时,可以这样结构化回答:
SHOW STATUS LIKE '%deadlock%'
innodb_print_all_deadlocks=on
记录全部死锁日志EXPLAIN
验证索引使用情况,用pt-deadlock-logger
自动化分析🙋 最后打个广告:如果需要开通**面试鸭**会员(原价99元),通过 面试鸭返利网 找我可返现25元!用省下的钱买杯咖啡☕,继续肝代码不香吗?
(扫码或访问 mianshiyafanli.com 获取返利)
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!
今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包