MySQL INFORMATION_SCHEMA.INNODB_TRX 怎样查看未提交事务
排查 MySQL 中“事务一直没有提交”时,可以先查询 INFORMATION_SCHEMA.INNODB_TRX。它展示当前仍在 InnoDB 内执行的事务,包括事务状态、开始时间、当前语句,以及事务大致锁住和修改的行数。
需要先划清一个边界:INNODB_TRX 不是提交历史表,也不会为每一种只读查询永久保留记录。它更像一个快速变化的观察窗口,适合回答“现在有哪些 InnoDB 事务还活着”,不适合单独证明完整的锁等待链。
结论:先用TRX_STATE、TRX_STARTED和TRX_QUERY找到可疑事务,再用TRX_MYSQL_THREAD_ID映射会话;如果要确认谁持有什么锁、谁在等待谁,还要结合 Performance Schema 的data_locks和data_lock_waits。

先用 INNODB_TRX 列出当前事务
最小查询不必一开始就关联很多系统表。先把事务身份、状态、时间和当前语句列出来,通常就能判断是否存在长期未提交的写事务:
SELECT
trx_id,
trx_state,
trx_started,
trx_mysql_thread_id,
trx_rows_locked,
trx_rows_modified,
trx_query
FROM information_schema.innodb_trx
ORDER BY trx_started;
-- 先按开始时间查看仍在 InnoDB 中的事务,便于发现持续时间较长的记录。
TRX_ID 是 InnoDB 的内部事务标识;TRX_STATE 常用来区分 RUNNING 和 LOCK WAIT;TRX_STARTED 给出事务开始时间;TRX_QUERY 可能包含该事务当前正在执行的语句。TRX_ROWS_LOCKED 是近似的锁定行数,TRX_ROWS_MODIFIED 则反映该事务修改和插入的行数,不能把它们当成精确的业务计数。
按持续时间和修改痕迹筛选可疑事务
如果记录很多,可以把“已经持续较久”和“有写入痕迹”作为第一轮筛选条件。时间阈值应该结合业务请求时长决定,下面只演示查询结构,不代表所有系统都应使用同一个秒数:
SELECT
trx_id,
trx_state,
trx_started,
TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS age_seconds,
trx_mysql_thread_id,
trx_rows_locked,
trx_rows_modified,
trx_query
FROM information_schema.innodb_trx
WHERE trx_started IS NOT NULL
AND TIMESTAMPDIFF(SECOND, trx_started, NOW()) >= 60
AND (trx_is_read_only = 0 OR trx_rows_modified > 0)
ORDER BY trx_started;
-- 60 秒只是示例阈值;生产环境应按接口或批处理的正常时长调整。
-- 只把非只读或有修改痕迹的事务放进第一轮排查结果。
看到一条持续时间很长的 RUNNING 记录,不等于可以立即终止连接:它可能正在执行合法批处理,也可能只是应用忘记了 COMMIT。先看 TRX_QUERY、开始时间和修改规模,再回到应用日志确认请求归属。
用 TRX_MYSQL_THREAD_ID 找回连接上下文
TRX_MYSQL_THREAD_ID 是把事务观察结果映射回 MySQL 会话的重要线索。它可以帮助你把内部事务记录与进程列表中的连接 ID 对照起来,但对照过程也受权限和数据刷新时机影响,不能把两个系统表的内容当成同一时刻的强一致快照。
SELECT
trx_mysql_thread_id,
trx_state,
trx_started,
trx_query
FROM information_schema.innodb_trx
WHERE trx_mysql_thread_id IS NOT NULL
ORDER BY trx_started;
-- 先取出连接线索,再到会话信息中查看用户、主机和连接状态。
-- 不要只凭 trx_id 猜测应用连接,trx_mysql_thread_id 才是会话映射字段。
如果你还需要查看连接用户、来源主机或当前会话的更多字段,可以再按这个 ID 查询会话信息。查询结果为空时,要考虑事务刚好结束、会话信息已刷新,或者当前账号没有读取相应系统信息的权限。
事务概况和锁关系排查不是一回事

INNODB_TRX 适合回答“事务是谁、何时开始、当前处于什么状态、正在做什么”。当问题变成“哪个事务持有了具体锁”“哪个请求在等待”“等待关系是否已经变化”,应该继续查看 Performance Schema 的 data_locks 和 data_lock_waits。
这几个观察表的数据本身变化很快。事务可能在你执行第一条查询后立即提交,锁等待也可能在第二条查询前消失。因此,把它们当成定位线索而不是审计日志;需要留证时,应在应用日志、慢查询日志或专门的监控采集链路中保存上下文。
权限、只读事务和快照边界
查询 INNODB_TRX 通常需要 PROCESS 权限。没有权限时,不要通过改写查询去猜测缺失数据,应让管理员按最小权限原则授予观察权限,并确认生产环境的权限审计要求。
还要注意两个容易误判的情况:
- 只读且不加锁的事务可能不会创建 InnoDB 事务 ID,因此不能用“没有
TRX_ID”推断业务没有执行查询。 TRX_ROWS_LOCKED是近似值,且系统表反映的是读取瞬间的内部状态;不要把一次结果直接当成完整的锁定行清单。
SELECT
trx_id,
trx_state,
trx_is_read_only,
trx_autocommit_non_locking,
trx_started,
trx_query
FROM information_schema.innodb_trx
ORDER BY trx_started;
-- 通过只读和 autocommit 标记区分“观察到的事务”与普通写事务。
-- 这些标记用于解释结果,不应单独作为终止事务的依据。
常见问题
INNODB_TRX 为空,是否代表没有未提交事务?
不能直接这样下结论。它只表示当前查询窗口没有返回正在 InnoDB 中执行的事务记录,还要排除事务刚结束、事务属于非 InnoDB 表、只读非锁定查询没有生成对应事务 ID,以及权限不足等情况。
TRX_STATE 是 LOCK WAIT 就一定存在严重阻塞吗?
它说明事务正在等待锁,但严重程度仍取决于等待时间、业务超时和阻塞关系。要找具体锁和等待双方,应继续查看 data_locks 与 data_lock_waits,不要只凭状态值终止连接。
为什么 TRX_QUERY 为空?
事务可能暂时没有正在执行的语句,或者语句已经结束但事务仍未提交。此时结合 TRX_STARTED、TRX_MYSQL_THREAD_ID 和应用侧请求日志判断,比把空值当成异常更可靠。
把 INNODB_TRX 当作“当前事务概况表”,先定位身份、状态和时间,再按需扩展到锁关系和会话上下文,排查未提交事务会更稳妥。
MySQL 生成列怎样配合索引解决 JSON 条件查询
- 上一篇
- MySQL 生成列怎样配合索引解决 JSON 条件查询
- 下一篇
- MySQL EXPLAIN ANALYZE 怎样看排序是否落盘
-
- 数据库 · MySQL | 25分钟前 |
- MySQL collation_connection 怎样排查字符串比较异常
- 149浏览 收藏
-
- 数据库 · MySQL | 25分钟前 | MySQL · 数据库 · DDL · 迁移 · InnoDB · mysql innodb ALTER TABLE INSTANT ADD COLUMN 在线DDL 表结构变更
- MySQL INSTANT ADD COLUMN 怎样判断 DDL 是否支持
- 149浏览 收藏
-
- 数据库 · MySQL | 43分钟前 | MySQL · mysql SQL JSON JSON_TABLE NESTED PATH
- MySQL JSON_TABLE 多个 NESTED PATH 为什么会补出 NULL 行
- 189浏览 收藏
-
- 数据库 · MySQL | 46分钟前 | MySQL · SQL · mysql WITH RECURSIVE cte_max_recursion_depth CTE 递归查询
- MySQL CTE 递归查询怎样限制深度
- 360浏览 收藏
-
- 数据库 · MySQL | 47分钟前 | MySQL · 执行计划 · sql优化 · 性能排查 · mysql 排序 磁盘临时表 EXPLAIN ANALYZE Sort_merge_passes
- MySQL EXPLAIN ANALYZE 怎样看排序是否落盘
- 264浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL 不同字符集列的索引长度参数对比
- 118浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL Performance Schema 按线程聚合等待事件
- 306浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL 事务隔离级别与锁定读的组合方案
- 271浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 838次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 836次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 919次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 894次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 719次使用
-
- MySQL 明明加了索引,为什么查询还是很慢?先查这 6 个点
- 2026-06-27 374浏览
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- golang 基于 mysql 简单实现分布式读写锁
- 2023-01-07 384浏览
-
- 详解如何利用GORM实现MySQL事务
- 2023-01-07 184浏览
-
- Go语言实现操作MySQL的基础知识总结
- 2023-01-23 265浏览

