当前位置: 首页 > news >正文

《100个“反常识”经验12:死锁日志怎么看?》

本期摘要

数据库突然卡死,应用日志里一堆“Deadlock found”。你遇到过吗?死锁不是Bug,是并发事务资源竞争的正常现象。本文不讲复杂的死锁理论,直接带你读MySQL死锁日志:怎么看事务1在等什么锁、事务2拿着什么锁、谁被回滚了。看完你就能在三分钟内定位到问题SQL,而不是盲目重启。

一次让人想砸键盘的故障

业务高峰期,突然大量接口超时。应用日志里全是:

text

Deadlock found when trying to get lock; try restarting transaction

登录MySQL,执行:

sql

SHOW ENGINE INNODB STATUS\G

找到 LATEST DETECTED DEADLOCK 这一段。看到日志的瞬间两眼一黑——全是十六进制地址和晦涩的锁信息,根本不知道在说什么。

死锁日志到底在说什么?

一条典型的死锁日志长这样:

sql

*** (1) TRANSACTION: TRANSACTION 310479085, ACTIVE 12 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s) *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 104 page no 45 n bits 80 index idx_user_id of table `db`.`orders` trx id 310479085 lock_mode X locks rec but not gap waiting *** (2) TRANSACTION: TRANSACTION 310479086, ACTIVE 10 sec starting index read mysql tables in use 1, locked 1 4 lock struct(s), heap size 1136, 3 row lock(s) *** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 104 page no 45 n bits 80 index idx_user_id of table `db`.`orders` trx id 310479086 lock_mode X locks rec but not gap *** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 104 page no 52 n bits 80 index idx_status of table `db`.`orders` trx id 310479086 lock_mode X locks rec but not gap waiting *** (2) ROLLBACK TO SAVE POINT

拆开来看,每个字段都有含义:

字段含义对我们有用的信息
TRANSACTION 310479085事务ID区分两个事务
ACTIVE 12 sec事务活跃时间超过几秒就要警惕
waiting for this lock在等哪个锁告诉你被卡在哪个索引上
holds the lock(s)持有哪些锁告诉你对方占了什么
index idx_user_id索引名称定位到具体表和索引
tabledb.orders表名哪个表出问题了
ROLLBACK谁被回滚了事务2被干掉,事务1继续

两分钟定位问题的思路

第一步:找到事务1等什么

看 (1) WAITING FOR THIS LOCK:它被卡在idx_user_id上,在等一个行锁。

第二步:找到事务2占什么

看 (2) HOLDS THE LOCK(S):它占着idx_user_id上的锁,同时在等idx_status上的锁。

第三步:得出结论

事务1需要 user_id=xxx 的锁,事务2占着它不放,同时事务2又在等另一条记录的锁。循环等待。

第四步:回看业务代码

两个事务的SQL分别是:

事务1:

sql

UPDATE orders SET status = 'paid' WHERE user_id = 123 AND order_id = 456;

事务2:

sql

UPDATE orders SET status = 'shipped' WHERE status = 'paid' AND order_id = 456;

事务1先锁住了 user_id 索引,事务2锁住了 order_id 索引,互相等待。

如何解决?

临时方案:kill掉被回滚的事务对应的应用连接,释放锁。

永久方案

  • 统一事务内的SQL顺序,让所有事务按相同顺序访问表和索引

  • 优化索引,减少行锁范围

  • 拆分大事务,缩短锁持有时间

  • 使用 READ COMMITTED 隔离级别,减少间隙锁

快速排查脚本

sql

-- 查看当前锁等待 SELECT * FROM information_schema.innodb_lock_waits; -- 查看当前事务 SELECT * FROM information_schema.innodb_trx WHERE trx_state = 'LOCK WAIT';

下期预告

《100个“反常识”经验13:凌晨3点,我误把生产当测试》

http://www.jsqmd.com/news/711105/

相关文章:

  • Python AI原生应用推理加速实战手册(PyTorch 2.4 + Inductor + vLLM深度调优全图谱)
  • 掌握this关键字
  • 物理AI推动人机协作迈向新阶段研究报告凯捷 2026_01
  • Windows Cleaner终极指南:三步解决C盘爆满与系统卡顿问题
  • 为什么92%的开发者配不稳Copilot Next自动化流?——源自Microsoft官方仓库commit日志的3大隐藏约束解析
  • 论文降重新纪元:书匠策AI,一键解锁学术纯净秘籍
  • CVPR2023 RIDCP论文精读:除了SOTA结果,它的‘可控先验匹配’设计思路能给你的项目什么启发?
  • Python自动化抢票终极指南:告别手速焦虑,3步轻松搞定大麦网热门演出
  • 云顶之弈悬浮辅助工具TFT Overlay:三步提升你的战术决策效率
  • AGV双锂电池系统厂家推荐(双电池/换电系统方案解析)【浩博电池】
  • 论文“瘦身”新秘籍:书匠策AI,一键解锁降重降AIGC新境界
  • Kaimon.jl:基于MCP协议实现AI助手与Julia运行时的深度集成
  • 常用16进制转换
  • 深度强化学习实战:从DQN到A3C,拆解智能体决策引擎核心原理
  • 抖音批量下载完整指南:快速掌握高效下载技巧
  • 《每日一命令12:kill——不只是杀进程这么简单》
  • 机器人双电池厂家推荐(双电池/热插拔系统解决方案)【浩博电池】
  • 医学影像报告自动生成技术:临床对比解码(CCD)详解
  • AI 系统的“可预测性”:我们真的能信任 AI 吗?
  • AutoHideCursor:自动隐藏鼠标光标,打造无干扰桌面工作环境
  • Windows任务栏透明美化终极指南:5分钟让桌面焕然一新的简单教程
  • Docker AI Toolkit 2026安装失败率下降87%的秘密:4类典型报错诊断树+自动修复脚本(限前500名领取)
  • 2026 最新 ReAct 框架详解!搞懂 AI Agent 核心底层原理,小白也能学明白
  • 抖音音频批量下载终极指南:免费开源工具让音乐收集效率提升90%
  • STM32按键控制LED避坑指南:从GPIO模式选择到消抖代码的常见误区
  • MCP插件生态安全加固实战(CVE-2024-XXXX已触发!立即启用这4道动态准入网关)
  • NCM文件解密终极指南:3步快速解锁网易云音乐加密格式
  • Win11Debloat完整指南:如何通过PowerShell脚本彻底优化Windows 10/11系统性能
  • TextIn xParse全解析与完整使用指南:非结构化文档秒变结构化数据的AI基础设施
  • DreamCAD:多模态参数化CAD生成框架解析