间隙锁排查实战:一条SQL揪出阻塞元凶

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 数据库小学妹带你实战排查间隙锁!用`SHOW ENGINE INNODB STATUS`快速定位`LOCK WAIT`与`gap before rec`,结合`performance_schema.data_lock_waits`精准识别阻塞源,厘清锁等待、死锁根因,避开RC无隙锁、无索引变表锁等常见误区。

📌 关键词:间隙锁、锁等待、performance_schema、SHOW ENGINE INNODB STATUS、死锁

大家好呀!我是数据库小学妹👋

上一篇我们搞懂了MVCC和锁联手如何解决幻读,知道了Next-Key Lock(行锁+间隙锁)是RR隔离级别下的“幻读克星”。

但理论懂了,实战中遇到问题时,怎么快速定位?比如,事务突然卡住、插入被阻塞——这背后很可能藏着一个间隙锁幽灵在作祟!

今天我们就用MySQL自带的监控工具,手把手揪出间隙锁,让问题无所遁形!


一、场景模拟:间隙锁引发的“插入阻塞”

假设订单表 orders 有索引字段 order_date。事务A执行了范围锁定:

--- 事务A
BEGIN;
SELECT * FROM orders 
WHERE order_date BETWEEN '2026-05-01' AND '2026-05-10' 
FOR UPDATE;
-- 事务A 未提交

此时,事务B试图插入一条新订单:

-- 事务B(另一个会话)
INSERT INTO orders (order_id, order_date) VALUES (1005, '2026-05-05');

​🌈结果:​事务B被​卡住不动​。
​🚩原因:​事务A的间隙锁锁住了 order_date[2026-05-01, 2026-05-10] 范围内的“间隙”,导致新插入被阻塞。


二、排查利器1:SHOW ENGINE INNODB STATUS——快速定位锁等待

当系统出现卡顿时,第一步:登录MySQL,执行:

SHOW ENGINE INNODB STATUS\G

在输出中搜索 TRANSACTIONS 段落,找到处于 LOCK WAIT 的事务。关键信息:

  • WAITING FOR THIS LOCK TO BE GRANTED:显示正在等待的锁类型(如 lock_mode X locks gap before rec
  • 锁的范围​:例如 RECORD LOCKS ... index order_date ... lock_mode X locks gap before rec
  • 阻塞事务ID​:找到持有锁的事务(事务A)

💡 如果看到 LATEST DETECTED DEADLOCK,说明发生了死锁(InnoDB已自动回滚一个事务),需进一步分析。


三、排查利器2:performance_schema——深入锁细节

MySQL 5.7+版本提供了更强大的性能监控工具performance_schema

执行以下查询,直接获取锁等待关系:

SELECT 
    OBJECT_SCHEMA, OBJECT_NAME,
    INDEX_NAME,
    LOCK_TYPE, LOCK_MODE,
    LOCK_STATUS,
    BLOCKING_ENGINE_TRANSACTION_ID,
    REQUESTING_ENGINE_TRANSACTION_ID
FROM performance_schema.data_lock_waits
JOIN performance_schema.data_locks 
  ON data_lock_waits.REQUESTING_ENGINE_LOCK_ID = data_locks.ENGINE_LOCK_ID;

🔖重点关注字段:

  • LOCK_MODE = 'X,GAP' → 排他间隙锁
  • LOCK_STATUS = 'WAITING' → 谁在等
  • BLOCKING_ENGINE_TRANSACTION_ID → 谁在阻塞

拿到阻塞事务ID后,到 INNODB_TRX 表查具体SQL:

SELECT trx_id, trx_state, trx_started, trx_query 
FROM information_schema.INNODB_TRX 
WHERE trx_id = 阻塞事务ID;

四、实战解读:一个典型的间隙锁日志

执行 SHOW ENGINE INNODB STATUS 后,你会看到类似这样的片段:

---TRANSACTION 31045, ACTIVE 10 sec
2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 8, query id 123 localhost root
SELECT * FROM orders WHERE status = 'pending' FOR UPDATE
---TRANSACTION 31046, ACTIVE 5 sec
1 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1
MySQL thread id 9, query id 124 localhost root
INSERT INTO orders (id, status, amount) VALUES (7, 'pending', 150)
------- TRX HAS BEEN WAITING 5 sec FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 28 page no 4 n bits 72 index idx_status of table `test`.`orders` trx id 31046 lock_mode X locks gap before rec

​🌈结论:​事务31046(INSERT)在等待一个 lock_mode X locks gap before rec(间隙锁),持有者是事务31045(FOR UPDATE查询)。


五、避坑指南:间隙锁排查的3个易错点

易错点 正确理解
间隙锁 ≠ 死锁 间隙锁导致锁等待(需手动处理);死锁自动回滚,日志会记录
RC级别无间隙锁 读已提交(RC)下不会产生间隙锁。若performance_schema仍显示gap,可能是视图残留,以实际隔离级别为准
无索引 = 表锁陷阱 WHERE条件无索引时,间隙锁会升级为全表锁,性能暴跌!务必先用EXPLAIN检查

👋 我是数据库小学妹一个用设计师思维学数据库的转行人。我们一起把复杂的技术变得简单有趣!💕

本文示例基于 ​MySQL​ 8.0。不同版本锁表名有差异(5.7用INNODB_LOCKS等),请自行适配。

相关文章
|
22天前
|
SQL 关系型数据库 MySQL
数据量大查询慢?索引让你的SQL秒级响应!|转行学DB第9天
用生活化比喻(如字典目录)详解索引原理:它通过B+树结构加速查询,避免全表扫描;涵盖创建、查看、删除索引方法,联合索引的最左前缀原则,以及读写平衡等实战要点——让查询从“等几秒”变“秒出”!
数据量大查询慢?索引让你的SQL秒级响应!|转行学DB第9天
|
2月前
|
存储 弹性计算 NoSQL
阿里云服务器通用算力型u2i实例:企业级独享资源+性能保障,适配Web/Java/数据库场景
阿里云通用算力型u2i实例作为企业级独享计算资源,兼容多代Intel至强处理器,算力较前代提升40%,I/O与网络性能显著增强,确保稳定可靠。适用于Web、Java、中小型数据库等场景,提供从2核到32核的丰富规格。其优势在于性能全面跃升、企业级独享资源保障,且价格合理。对于新上云企业或寻求性能升级的用户,u2i实例是理想选择,可显著提升业务处理效率与稳定性。
406 5
|
21天前
|
算法 Linux iOS开发
SecureCRT & SecureFX 9.7.2 发布 - 跨平台的多协议终端仿真和文件传输
SecureCRT & SecureFX 9.7.2 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输
422 2
SecureCRT & SecureFX 9.7.2 发布 - 跨平台的多协议终端仿真和文件传输
|
14天前
|
人工智能 自然语言处理 API
TokenPlan是什么?阿里云百炼Token Plan详细解析:Credits计费、模型生态、省钱技巧与配置指南
随着AI大模型在团队协作、研发编程、内容创作、智能体开发等场景深度渗透,企业与开发者对大模型服务的诉求愈发清晰:**预算可控、调用稳定、多模型兼容、数据安全、易于管理**。阿里云百炼平台面向团队与企业场景推出的**Token Plan团队版**订阅服务,正是为解决这些核心痛点而生。它以**Credits统一计量**为核心,打通文本生成、图像生成、多模态理解全品类模型,兼容主流AI编程与智能体工具,提供三档包月坐席、团队权限管理、高峰期不降速、数据不用于训练等企业级能力,让团队在固定预算内高效、稳定使用AI大模型,彻底告别按量计费的账单焦虑与传统套餐的功能局限。
711 7
|
19小时前
|
人工智能 弹性计算 数据可视化
Hermes Agent/OpenClaw 阿里云部署接入Slack保姆级教程
2026年,OpenClaw(前身为Clawdbot、Moltbot)凭借轻量化容器化架构、灵活的跨平台集成能力与强大的自动化任务执行功能,成为全球化团队、远程办公场景下的核心AI协作工具。其开源特性与插件化设计,可深度适配Slack这款海外主流企业协作平台,实现“Slack频道/私信下达指令,阿里云服务器运行的OpenClaw自动执行任务”的高效协作模式。Slack作为覆盖全球的企业级即时通讯与协作工具,具备频道管理、团队权限管控、多终端同步、第三方应用无缝集成等优势,将OpenClaw与Slack深度对接,可彻底打破“AI工具与协作平台脱节”的痛点,让团队在熟悉的Slack环境中,一键调用
28 4
|
2月前
|
人工智能 安全 Linux
阿里云+本地部署OpenClaw|Agent-Reach免费全网能力+千问/Coding Plan API配置指南
2026年,AI智能体的核心价值已从“本地任务执行”升级为“实时信息交互”,而OpenClaw(原Clawdbot)作为开源AI自动化框架的代表,虽具备强大的任务执行能力,却受限于“断网”瓶颈——无法获取实时信息、依赖付费API、平台访问受限等问题,严重制约其应用场景。Agent-Reach的出现彻底打破这一困境,作为完全开源免费的联网插件,它无需付费API-Key即可解锁全网信息获取能力,支持网页、YouTube、B站、GitHub、RSS等数十个平台,搭配阿里云千问大模型的强推理能力或Coding Plan免费API的低成本优势,让OpenClaw真正具备“实时搜索、跨平台内容提取、动态信
553 8
|
13天前
|
前端开发 定位技术 开发者
前端组件库——NativeBase知识点大全(三)
教程来源 http://lemci.cn NativeBase v3提供开箱即用的响应式断点系统(base/sm/md/lg/xl),支持数组/对象语法快速适配多端;结合`useBreakpointValue`、按需导入与动态加载,兼顾开发效率与性能优化。
|
9天前
|
JavaScript 算法 数据库
制造业报价困局:BOM自动解析与智能报价核算破局
JBoltAI推出智能报价系统,以BOM自动解析与智能核算技术破解制造业报价难题:秒级解析复杂物料清单,精准匹配工艺参数,标准化核算加工费及杂项成本,提升报价效率与准确性,助力企业降本增效、赢得订单。(239字)
59 5
|
14天前
|
SQL 关系型数据库 MySQL
SQL优化十大技巧,查询速度提升10倍!
数据库小学妹带你轻松提速SQL!10个实战优化技巧:精简SELECT、善用LIMIT、巧用EXPLAIN、合理建索引、避开函数索引失效、JOIN优于子查询、IN替代OR、批量操作、EXISTS优化大子查询、定期OPTIMIZE。附避坑指南,新手也能秒上手!
|
14天前
|
人工智能 监控 安全
桌面管理:统一强制屏保策略,筑牢终端安全防线,满足等保合规要求
本文剖析一起因未锁屏导致的数据泄露事件,指出终端安全基线的重要性;结合等保2.0要求,强调统一强制屏保与自动锁屏的必要性;介绍阿里云云桌面(EDS)与Endpoint Security提供的策略统管、强制执行、实时审计能力;并以某国产系统为例,展示智能触发、品牌化屏保、强身份再验证等集成实践,助力企业筑牢终端安全防线。