事务与锁的进阶实战:读懂死锁日志之外的锁等待链
大家好我是小耶写功课只是为了我踩过的坑你们别再踩了前几周我们讲了死锁排查——怎么读SHOW ENGINE INNODB STATUS、怎么从日志里找到两个冲突的事务。但死锁只是锁问题的“冰山一角”。死锁会直接报错你一眼就能看到。但真正让系统“卡住”的往往是那些不报错、不告警、只默默等待的锁等待问题。一条SQL平时0.1秒今天突然3秒。执行计划没变、索引没坏、数据量也没暴涨。你翻遍慢查询日志找不到原因——问题可能不在SQL本身而在它“等锁”了。今天把锁等待的排查方法彻底拆开讲一遍。一、死锁 vs 锁等待两种截然不同的锁问题先搞清楚这两个概念的区别死锁Deadlock两个事务互相持有对方需要的锁形成循环等待。数据库检测到后会主动回滚其中一个事务报Deadlock found错误。特点是“报错”——DBA能直接看到。锁等待Lock Wait一个事务在等另一个事务释放锁但另一个事务还在正常执行没有形成循环。被阻塞的事务会一直等直到超时innodb_lock_wait_timeout默认50秒。特点是不报错——业务只是变慢没有错误日志。死锁是“急诊”——需要立即处理。锁等待是“慢性病”——它不会一下子让系统崩溃但会让系统越来越慢而你很难找到病根。二、锁等待的三种典型场景场景一长事务持有锁不释放一个事务执行了UPDATE但没有提交然后去调用外部API、做复杂计算、或者等用户输入。在此期间它持有的锁一直不释放其他事务全部被阻塞。场景二大事务分批执行不当一个事务里包含了大量操作——比如一次性更新100万行。事务执行期间锁一直持有其他事务被长时间阻塞。场景三热点行竞争多个事务同时操作同一行数据比如秒杀场景下的库存扣减。虽然每个事务都很快但高并发下锁等待时间叠加整体响应变慢。三、锁等待排查的核心工具工具一SHOW ENGINE INNODB STATUS这个命令除了显示死锁信息还会显示当前的锁等待情况。在LATEST DETECTED DEADLOCK之后还有一个TRANSACTIONS部分会列出当前所有活跃事务及其持有的锁。SHOW ENGINE INNODB STATUS\G找到TRANSACTIONS部分重点关注ACTIVE时间——事务活跃了多久LOCK WAIT——是否在等待锁HOLDS THE LOCK(S)——持有哪些锁WAITING FOR THIS LOCK——在等哪个锁工具二INFORMATION_SCHEMA.INNODB_TRX这是最常用的锁等待监控视图。它显示当前所有活跃事务的详细信息SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query, trx_rows_locked, trx_rows_modified, TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS trx_duration_sec FROM information_schema.INNODB_TRX WHERE trx_state RUNNING ORDER BY trx_started;关键字段解读字段含义诊断价值trx_started事务开始时间判断是否长事务trx_rows_locked锁定的行数锁范围有多大trx_rows_modified修改的行数事务大小trx_query当前执行的SQL定位具体操作工具三INFORMATION_SCHEMA.INNODB_LOCK_WAITS这个视图直接显示谁在等谁SELECT * FROM information_schema.INNODB_LOCK_WAITS;输出中包含requesting_trx_id等待的事务和blocking_trx_id阻塞的事务可以直接看出锁等待链。四、锁等待链的完整排查流程第一步找出所有在等待锁的事务SELECT * FROM information_schema.INNODB_TRX WHERE trx_state LOCK WAIT;第二步找出谁在阻塞它们SELECT waiting_trx_id, waiting_thread, blocking_trx_id, blocking_thread FROM sys.innodb_lock_waits;schema是MySQL 5.7自带的系统库比直接查INFORMATION_SCHEMA更方便。第三步检查阻塞事务在做什么拿到blocking_trx_id后回到INNODB_TRX查看该事务的详细信息SELECT trx_id, trx_started, trx_query, trx_rows_locked, trx_rows_modified FROM information_schema.INNODB_TRX WHERE trx_id blocking_trx_id;第四步判断阻塞事务是否可以终止如果事务活跃时间很长10秒且一直没有提交 → 可能是应用代码忘记提交或回滚如果事务正在执行一个很慢的SQL → 可能需要优化该SQL如果事务处于SLEEP状态 → 可能是连接池中的空闲连接持有锁第五步决定处理方式如果阻塞事务是“僵尸事务”应用已经断开但事务未提交→ 执行KILL终止该连接如果阻塞事务是正常业务但执行时间过长 → 优化SQL或拆分事务如果阻塞事务是热点行竞争 → 考虑优化业务逻辑或使用乐观锁五、实战案例一个真实的锁等待排查现象某电商系统下午3点开始订单创建接口响应时间从200ms飙升到3秒持续了20分钟后自动恢复。排查过程查看INNODB_TRX发现有13个事务处于LOCK WAIT状态通过sys.innodb_lock_waits找到阻塞者一个事务ID为310298的事务查看该事务信息trx_started是25分钟前trx_rows_modified5000trx_queryNULL该事务处于SLEEP状态说明应用已经断开了连接但事务没有提交或回滚根因应用代码中有一个Transactional注解的方法内部调用了外部API。外部API超时导致方法异常退出但事务没有回滚锁一直持有。后续所有操作同一行数据的请求全部被阻塞。解决方案事务中不调用外部API将外部调用移到事务外。或者在Transactional中设置超时时间。六、锁等待对系统性能的“隐性影响”锁等待不像死锁那样“显眼”但它对系统性能的影响可能更大影响一响应时间线性增加一个查询本身0.1秒但等锁等了0.5秒总响应时间变成0.6秒。如果每秒有100个这样的查询系统整体响应时间就会明显变慢。影响二连接池耗尽大量请求被阻塞等待锁连接池中的连接被占用但无法释放。新请求无法获取连接业务直接报错。影响三连锁阻塞一个长事务阻塞了10个请求这10个请求又各自持有其他锁阻塞了更多请求——形成连锁反应。七、锁等待的预防策略1. 监控长事务建议设置阈值告警事务活跃时间超过10秒自动告警。虽然long_query_time无法覆盖事务场景SQL已经执行完但事务未提交慢查询日志不会记录但可以用INNODB_TRX定期扫描实现告警。-- 每10秒执行一次检测活跃超过10秒的事务 SELECT trx_id, trx_started, trx_mysql_thread_id, TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS duration_sec FROM information_schema.INNODB_TRX WHERE trx_state RUNNING AND TIMESTAMPDIFF(SECOND, trx_started, NOW()) 10;2. 拆分长事务避免在一个事务中处理大量数据。将大事务拆分为多个小事务每批处理一部分数据并提交。3. 事务中不调用外部API事务中调用外部API是不可控的——外部API可能超时、可能报错、可能响应很慢。在外部API返回之前事务持有的锁一直不释放。正确做法是外部调用放在事务之前或之后事务内只做数据库操作。4. 设置合理的锁超时MySQL的innodb_lock_wait_timeout默认50秒。如果业务对响应时间敏感可以适当降低这个值让被阻塞的事务更快失败而不是长时间等待。八、总结锁等待是比死锁更隐蔽、更难发现的性能问题。它不报错、不告警只默默让系统变慢。排查锁等待的核心工具SHOW ENGINE INNODB STATUS查看当前锁状态INFORMATION_SCHEMA.INNODB_TRX查看所有活跃事务INFORMATION_SCHEMA.INNODB_LOCK_WAITS查看锁等待链sys.innodb_lock_waits一站式查看锁等待关系预防锁等待的三个关键监控长事务——设置阈值告警主动发现拆分长事务——大事务拆小减少锁持有时间事务中不调用外部API——外部调用不可控锁不能跟着等死锁是“急诊”锁等待是“慢性病”。一个DBA的进阶就是从只会处理“急诊”到能诊断“慢性病”。小耶在手SQL 不愁还有什么想了解的欢迎留言小耶一定知无不言言无不尽……我们下次见~

相关新闻

等保合规威胁建模:把监管要求翻译成架构层面的控制点

等保合规威胁建模:把监管要求翻译成架构层面的控制点

等保合规威胁建模:把监管要求翻译成架构层面的控制点 一、条款很抽象,架构很具体:等保落地的断层 等保(网络安全等级保护)的条款,写的是"应采取""应实现""应审计"这样的原则…

2026/7/22 15:20:39阅读更多 →
Canvas粒子系统实现情绪化动画:从烟花易冷看代码艺术创作

Canvas粒子系统实现情绪化动画:从烟花易冷看代码艺术创作

那天晚上,我正为一个项目渲染一段粒子特效,屏幕上的光点明明灭灭,忽然就想起了很多年前用代码模拟烟花的日子。那些简单的二维动画,没有复杂的三维模型和物理引擎,却总能精准地触动人心。于是,我关掉了庞大…

2026/7/22 15:20:39阅读更多 →
Unity异步编程实战:深入理解async与await的应用技巧

Unity异步编程实战:深入理解async与await的应用技巧

1. 项目概述:为什么Unity开发者必须掌握异步编程? 如果你在Unity里写过需要加载资源、等待网络请求或者执行耗时计算的代码,大概率遇到过游戏卡顿、界面冻结的尴尬情况。传统的协程(Coroutine)虽然能解决一部分问题&am…

2026/7/22 15:18:39阅读更多 →
Flannel 原理与部署实战:Overlay 网络如何实现跨节点 Pod 通信

Flannel 原理与部署实战:Overlay 网络如何实现跨节点 Pod 通信

系列导读 你现在看到的是《K8s 网络 CNI 深度剖析与排障实战:从原理到生产级故障排查》的第 2/10 篇,当前这篇会重点解决:以 Flannel 为入口,展示 Overlay 网络的核心原理,提供从部署到排障的完整闭环 上一篇回顾:第 1 篇《K8s 网络模型与 CNI 接口设计:从 Pod IP 到网…

2026/7/22 16:16:52阅读更多 →
【转载】【安装指南】maven下载、安装与配置详细教程

【转载】【安装指南】maven下载、安装与配置详细教程

一、概述 maven功能与python的pip类似。 Apache Maven是一个用于软件项目管理和构建的强大工具。它是基于项目对象模型的,用于描述项目的构建配置和依赖关系。以下是一些关键的 Maven 特性和概念: POM(Project Object Model)&…

2026/7/22 16:16:52阅读更多 →
C28x DSP VCU-II指令集深度解析:伽罗华域与维特比译码的硬件加速实践

C28x DSP VCU-II指令集深度解析:伽罗华域与维特比译码的硬件加速实践

1. 项目概述在嵌入式信号处理领域,尤其是在无线通信、卫星导航、电力线载波通信以及工业控制等对实时性和可靠性要求极高的场景中,纠错编码是确保数据完整性的基石。其中,里德-所罗门(Reed-Solomon)编码和卷积码的维特…

2026/7/22 16:16:52阅读更多 →
宠物除臭喷雾技术拆解:复合生物酶多酶协同除臭反应路径与实测数据分析

宠物除臭喷雾技术拆解:复合生物酶多酶协同除臭反应路径与实测数据分析

📌 CSDN专属声明:本文为技术解析版本,核心检测数据与品牌官网同步发布。全文基于中广测(广东省科学院测试分析研究所,CNAS认可实验室)6份公开检测报告,报告编号可在中广测官网(www.f…

2026/7/22 16:16:52阅读更多 →
小白程序员轻松入门大模型:从 Agent 基础到实战搭建,收藏必备!

小白程序员轻松入门大模型:从 Agent 基础到实战搭建,收藏必备!

本文详细介绍了 Agent 的概念及其与 ChatBot 的区别,核心在于调用工具的能力。文章梳理了 LangChain、LangGraph 和 DeerFlow 三者的关系,其中 LangChain 定义基础工具和 LLM 对话,LangGraph 用图方式编排复杂工作流,DeerFlow 则在…

2026/7/22 16:16:52阅读更多 →
AI搜索服务选型倒计时:OpenSearch 2.12+ES 8.14+Vespa 8.3+Qdrant 1.9——仅剩3个版本支持实时多模态融合检索

AI搜索服务选型倒计时:OpenSearch 2.12+ES 8.14+Vespa 8.3+Qdrant 1.9——仅剩3个版本支持实时多模态融合检索

更多请点击: https://codechina.net 第一章:AI搜索服务选型倒计时:OpenSearch 2.12ES 8.14Vespa 8.3Qdrant 1.9——仅剩3个版本支持实时多模态融合检索 当前主流向量检索与语义搜索平台正经历关键兼容性窗口期。OpenSearch 2.12、Elasticsea…

2026/7/22 16:14:52阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →