死锁报错看了三遍没看懂?我拆给你看(附定位SQL)

简介: 从一次真实死锁现场切入,讲清行锁、间隙锁、插入意向锁的加锁机制与死锁形成原理,手把手教你怎么用show engine innodb status和information_schema定位死锁,并给出加锁顺序设计等避坑清单。

大家好,我是数据库小学妹👋 我踩过的坑,你别再踩。

上周线上又报死锁了。应用日志里刷了一串ERROR 1213,事务回滚,用户那边直接看到"操作失败,请重试"。群里问了一圈,没人看懂死锁日志。我打开show engine innodb status,盯着那段英文看了十分钟,才理清两个事务是怎么卡死的。

今天把死锁这件事拆开讲。锁是怎么锁的,死锁怎么形成,日志怎么看,最后怎么解。看完你应该能自己定位死锁了。

一、死锁是怎么形成的

死锁,白话讲就是两个事务互相等对方手里的锁,谁也不让,就卡死了。

InnoDB的锁主要分共享锁和排他锁。共享锁(S锁)读的时候加,多个事务可以同时持有。排他锁(X锁)写的时候加,跟其他锁都互斥。一个事务持有X锁,别的事务想再加锁,只能等。

光有行锁还不够,InnoDB还有间隙锁。它锁的不是某一行,是一段范围,主要用来防幻读。还有一个插入意向锁,是插入前申请的。这几个锁凑一起,死锁就容易了。

我那次死锁,是两个事务的加锁顺序反了。事务A先锁了订单表的某一行,再去锁用户表。事务B先锁了用户表,再去锁订单表。两边都拿着对方想要的锁,互等,谁也不放手。

事务A: 锁订单行1 → 想要用户行5(被B持有)→ 等待
事务B: 锁用户行5 → 想要订单行1(被A持有)→ 等待
结果: A等B,B等A,InnoDB选择回滚一个,报1213

二、死锁报错长什么样

死锁发生时,InnoDB会主动回滚一个事务,让另一个继续。被回滚的那个会收到这么个错误:

ERROR 1213 (40001): Deadlock found when trying to get lock;
try restarting transaction

翻译过来:检测到死锁,请重试事务。注意,InnoDB不会两个都回滚,它回滚代价小的那个,另一个正常提交。所以死锁不一定会丢数据,但被回滚的那次操作,业务得重试。在MySQL 8.0中,死锁检测机制从“按需触发”变成了后台线程持续追踪等待图(wait-for graph),一旦形成环就毫秒级回滚。这使得死锁能被更快发现,但在高并发下,检测本身的开销也值得关注。

很多人看到1213就慌了,以为数据坏了。其实不用慌,数据没坏,就是一次事务被回滚了。真正要查的是:为什么会死锁,能不能从根上避免。

三、死锁日志怎么读

关键一步是打开死锁日志,命令是show engine innodb status。死锁信息在LATEST DETECTED DEADLOCK这一段。需要留意的是,这个段只保存最近一次死锁的详情,生产环境死锁一多,前面的记录就被覆盖了。如果死锁频繁发生,建议开启innodb_print_all_deadlocks参数,把所有死锁日志都记录到error log中,方便回溯。

SHOW ENGINE INNODB STATUS\G

日志会列出两个事务,各自持有什么锁、在等什么锁。读的时候抓三个重点。

第一个,看两个事务在等什么锁。日志里TRANSACTION A持有X锁,等S锁。TRANSACTION B持有S锁,等X锁。一对比,就知道谁卡谁。

第二个,看加锁涉及的表和索引。日志会指出锁在哪个表的哪个索引上,还有具体的锁模式。LOCK_GAP、LOCK_REC_NOT_GAP这些标记,能看出是不是间隙锁引起的。

第三个,看哪条SQL触发的。日志里会带出事务最后执行的SQL,就是从哪条语句开始卡的。

读懂了这三块,死锁的基本盘就清楚了:谁先锁的,卡在哪,哪条SQL引起的。

四、用information_schema查锁等待

死锁日志是"事后"的,事情已经发生了。要防患于未然,得实时盯锁等待。

在 MySQL 8.0 中,information_schema.innodb_lock_waits已被弃用,推荐使用performance_schema下的表来查询锁等待:

-- MySQL 8.0+ 查询锁等待
SELECT
  r.trx_id AS waiting_trx_id,
  r.trx_mysql_thread_id AS waiting_thread,
  b.trx_id AS blocking_trx_id,
  b.trx_mysql_thread_id AS blocking_thread,
  TIMESTAMPDIFF(SECOND, r.trx_started, NOW()) AS wait_seconds
FROM performance_schema.data_lock_waits w
JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_engine_transaction_id
JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_engine_transaction_id;

查出阻塞线程后,去SHOW PROCESSLIST看它在跑什么SQL,是不是一个长事务占着锁不放。

如果仍在使用MySQL 5.7,可以沿用information_schema.innodb_lock_waits的写法。生产环境建议先确认MySQL版本,再选择对应的查询方式。

五、死锁怎么解

定位到根因,解法就清楚了。我总结了三条。

第一,统一加锁顺序。业务里凡是会同时碰多张表的,锁的顺序必须一致。先锁A再锁B,所有事务都这么干,就不会互相等。

第二,让事务尽量短。锁持有时间越长,撞车的概率越大。把查询、计算放到事务外,事务里只留必要的写入,锁很快就释放。

第三,用一致的索引路径。两个事务走不同的索引,加锁的行可能不同,反而容易撞出间隙锁死锁。让相关查询走同一个索引,加锁范围一致。

还有两个参数,innodb_lock_wait_timeoutinnodb_deadlock_detect,偶尔会用。前者是等锁超时时间,后者是死锁检测开关。这两个是兜底,别指望靠它们解决死锁。真正的解法,是业务层的加锁顺序。

避坑清单

别一看到1213就改** innodb_lock_wait_timeout 。死锁不是“等得不够久”,是加锁顺序的问题。调大超时,只是把问题往后拖,还可能让堵住的时间更长。我见过有人调到100秒,线上查询全堵了。

别顺手就KILL掉锁等待的线程。先看清楚是谁在持锁、持了多久。有可能是正常事务,只是跑得慢。乱杀线程,可能杀掉一个正在提交的业务事务,数据回滚,影响更大。

间隙锁最容易忽略。很多人以为死锁就是行锁互斥,其实间隙锁引起的死锁很常见,尤其插入操作。间隙锁本身是兼容的,两个事务可以在同一个间隙里同时加间隙锁。但一旦有事务想在这个间隙里插入数据,就会申请插入意向锁,而插入意向锁和间隙锁是冲突的。如果两个事务分别在对方的间隙里插数据,死锁就来了。所以插入操作密集的场景,尤其要留意间隙锁的覆盖范围。排查时多留意LOCK_GAP标记,我那次死锁就是两个事务插入时,间隙锁和插入意向锁撞了。

我的判断

死锁这东西,报错就一行,背后的锁机制却是一整套。它不像慢查询那么明显,更像是业务并发设计里藏着的雷。排查一次,你就能更懂InnoDB的加锁逻辑。我越来越觉得,死锁不是能靠调参调没的。真正的解法在业务层:加锁顺序、事务长度、索引路径。这些设计对了,死锁自然就少了。

遇到死锁别慌,也别急着改配置。先看懂日志,理清谁在等谁,再动手。这是我踩了无数次坑换来的经验。


你被死锁坑过吗?死锁日志看得懂不?评论区聊聊。我猜不少人都经历过"1213刷屏,盯着日志发呆"的时刻。

我是数据库小学妹,帮你少走弯路少踩坑,咱们下篇见👋

相关文章
|
19天前
|
人工智能 缓存 前端开发
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
DeepSeek Harness + DeepSeek V4 Pro 项目实战保姆级教程!手把手带你从零安装开源 AI 编程工具,开发架构图、知识讲解网站、3D 网页游戏、全栈 AI 应用 4 个项目,覆盖运行模式选择、插件安装与开发,看看能不能对标 Claude。
13114 84
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
|
7天前
|
人工智能 自然语言处理 安全
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
本文聚焦阿里云2026年推出的三款自研AI办公产品,清晰拆解千问办公、Qoder Teams、Qoder CN的差异化定位与能力边界:千问办公主打职场全场景提效,支持自然语言指令一键完成PPT生成、数据分析等高频办公任务;Qoder Teams面向程序员团队,深度整合AI代码生成、团队协同与企业知识库能力;Qoder CN则专为金融、政务等强合规场景打造,实现数据不出境与VPC私有化部署。文章同步给出分场景选型指南与最新活动定价,帮助不同类型的企业按需组合产品,实现业务岗、研发岗与强合规场景的AI能力全覆盖。
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
|
2天前
|
缓存 人工智能 API
阿里云Qwen3.8‑Flash完整能力解析:模型特性、API调用实操与计费规则深度拆解
在AI应用快速落地的当下,开发者与企业选型大模型API,不再只单纯关注评测榜单分数,推理速度、上下文长度、多模态能力、工具调用稳定性以及实际调用成本,共同决定项目能否平稳上线。Qwen3.8‑Flash作为新一代多模态混合专家模型,主打高性能推理与低成本开销,面向编程开发、智能Agent工作流、超长文档解析、图文混合理解等高频场景,提供托管API服务,权重同时开放可供本地部署,兼容主流接口协议,能够无缝接入各类开发工具链。很多开发者在接入过程中,容易混淆普通按量Token计费、缓存计费、各类订阅计划之间的差异,造成实际账单超出预估。本文从模型底层架构、核心功能能力、适用场景、API调用实操、完
692 0
|
12天前
|
Web App开发 人工智能 API
16 个超火的 DeepSeek Harness 插件,大肥鱼已经落后 N 个版本了。。。
DeepSeek Harness 精选插件推荐合集,从图片识别、浏览器操控、多 Agent 协作到手机远程控制,一口气带你看完 DSH 社区热门的十几个插件,覆盖技能扩展、UI 界面增强、整活玩法三大类,让你的鲸鱼变得更强。
1736 4
|
13天前
|
人工智能 Java BI
【AI】DeepSeek Harness 安装、运行、管理插件
本文介绍了如何运行DeepSeek开源的Agent框架DeepSeek Harness(dsh)。主要内容包括:使用nvm安装适配的Node版本;通过代理加速克隆GitHub源码;使用pnpm安装依赖并启动项目;配置DeepSeek API Token;安装扩展功能的插件。该框架自带Web界面,支持模型适配、文件编辑等插件化功能
1918 1
|
人工智能 JavaScript 开发工具
DeepSeek Harness 本地安装与使用指南
DeepSeek Harness(DSH)是DeepSeek AI开源的Agent运行框架,支持本地文件操作、命令执行与工具调用。基于Cordis插件架构,具备高扩展性与强可控性,适合开发者搭建可控Agent环境或开展模型基准测试。当前为开发者预览版,需Node.js环境,推荐先用`npx @deepseek-ai/dsh web`快速体验。
5153 0
|
15天前
|
人工智能 JavaScript 测试技术
保姆级教程:DeepSeek Harness从安装到跑通测试,30分钟上手
DeepSeek Harness是DeepSeek开源的AI Agent运行时,主打“一行命令安装、5分钟跑通”。它让模型真正动手干活——读代码、跑测试、分析失败、生成修复方案。本文手把手教你30分钟从零上手,覆盖安装、配置、实测及避坑指南,助你快速掌握下一代AI编程范式。
|
8天前
|
人工智能 Linux iOS开发
Ollama使用教程:Ollama官网下载、Ollama本地部署大模型(2026最新)
Ollama 是一款免费开源的本地大模型运行工具,支持在 Windows/macOS/Linux 上离线运行 Qwen、DeepSeek、Llama 等主流开源模型,数据不出本机、隐私安全。提供 OpenAI 兼容 API,命令行一键拉取/运行/管理模型,无需联网,无调用限制,是开发者与 AI 爱好者部署本地 AI 助手的理想选择。(239 字)
|
14天前
|
人工智能 JavaScript 测试技术
从 0 到 1,DeepSeek Harness 保姆级安装与使用教程!
DeepSeek Harness是DeepSeek推出的开源Agent运行框架,秉持“一切皆插件”理念,支持模型、工具、技能、工作流等全模块自由替换与扩展。其核心Cordis内核实现动态插件管理,赋能Agent自进化。已成GitHub史上增速最快开源项目(15w+ Star),标志着国内大模型从拼价格转向重架构与生态的新拐点。
1349 6
从 0 到 1,DeepSeek Harness 保姆级安装与使用教程!