首页 > 数据库 > SQL > 正文

SQL死锁日志怎么看_定位冲突SQL实战技巧【技巧】

舞夢輝影
发布: 2025-12-22 20:49:50
原创
538人浏览过
死锁日志需重点分析两个事务块,通过TRANSACTION ID、ACTIVE时间、HOLDS/WAITING锁及末尾SQL定位冲突环路与业务缺陷,并用SHOW ENGINE INNODB STATUS、innodb_print_all_deadlocks或information_schema表主动捕获。

sql死锁日志怎么看_定位冲突sql实战技巧【技巧】

死锁日志里找关键事务对

死锁日志本质是两个(或多个)事务互相卡住的“快照”,重点看带 *** (1) TRANSACTION*** (2) TRANSACTION 的两段。它们构成一个闭环:A等B的锁,B又等A的锁。

注意每段开头的 TRANSACTION ID(如 TRANSACTION 10047),这是唯一标识;再看 ACTIVE X sec,时间越短的通常是后发起、被回滚的那个(MySQL默认回滚代价小的事务)。

锁定资源和等待关系要对照着读

每个事务块里有三类关键行:

  • HOLDS THE LOCK(S):它现在攥着什么锁(比如 RECORD LOCKS space id 44 page no 3 index PRIMARY
  • WAITING FOR THIS LOCK:它正伸手要哪个锁(比如 lock_mode X locks rec but not gap waiting
  • query id xxx ... updating / deleting ...:最后执行的那条SQL,就是冲突源头

把事务1的 WAITING 和事务2的 HOLDS 对上,事务2的 WAITING 和事务1的 HOLDS 对上,就串出了死锁环路。例如:

绘ai
绘ai

ai绘图提示词免费分享

绘ai 240
查看详情 绘ai

事务1 → 等 idx_account 锁 → 该锁被事务2持有
事务2 → 等 PRIMARY 锁 → 该锁被事务1持有

从SQL语句反推业务逻辑缺陷

日志末尾的 SQL 往往很短,但必须结合表结构和索引理解实际加锁范围:

  • UPDATE t1 SET x=1 WHERE i = 1 → 若 i 是普通索引,会先持 i 索引上的记录锁,再持主键上的记录锁
  • DELETE FROM t1 WHERE mobile='185...' → 若 mobile 有唯一索引,只锁匹配行;若非唯一,则可能触发间隙锁(lock_mode X locks gap before rec
  • INSERT ... ON DUPLICATE KEY UPDATE → 在重复键检查阶段可能同时申请主键+唯一索引的锁,顺序不一致易引发死锁

快速定位死锁日志的三种方式

不是每次都能等到日志自动打印,得主动抓取:

  • SHOW ENGINE INNODB STATUS\G 查最近一次死锁(仅保留最后一次,适合应急)
  • 开启持久化记录:SET GLOBAL innodb_print_all_deadlocks = ON,之后所有死锁写入错误日志,可按时间检索
  • 查系统表辅助验证:SELECT * FROM information_schema.INNODB_TRX 看当前运行事务,INNODB_LOCK_WAITS 看谁在等谁

以上就是SQL死锁日志怎么看_定位冲突SQL实战技巧【技巧】的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号