首页/数据/数据库速查/INNODB_TRX 长事务观测
性能与调优57 条

INNODB_TRX 长事务观测

INNODB_TRX 列出活跃事务:起始时间、状态、行数、等待情况;trx_started 最早的那个通常就是锁事故源头。

数据库速查数据更新于 2026-10-13

长事务观测是什么

事务观测表列出当前活跃事务:开始时间、状态、已修改行数、关联连接与当前语句。它是排查锁等待与阻塞的第一现场:开始时间最早的那个事务,通常就是锁事故的源头。把「事务年龄」做成告警,比事故后翻日志高效得多。

基本信息

数据来源information_schema 中的事务视图
关键字段事务编号、状态、开始时间、已修改行数、连接号
状态取值运行中、等待锁、回滚中
年龄判定当前时间减去开始时间,超过业务阈值即长事务
关联手段通过连接号关联到连接列表,定位具体应用

典型使用场景

  • 锁等待排查:找出持锁最久的事务,判断是否需要终止
  • 慢接口复盘:定位接口内开启事务后长时间未提交的代码路径
  • DDL 前检查:准备改表结构前先确认没有长事务,避免等待超时
  • 批量任务优化:大批量处理分批提交,避免单事务过大
  • 例行巡检:把事务年龄接入监控,提前发现异常持锁

找出最老的事务

找出最老的事务
SELECT trx_id, trx_state, trx_started,
       TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS age_seconds,
       trx_rows_modified, trx_mysql_thread_id, trx_query
FROM information_schema.INNODB_TRX
ORDER BY trx_started LIMIT 10;
-- 结合连接列表定位来源应用
SELECT id, user, host, db, command, time, state, info
FROM information_schema.processlist
WHERE id IN (SELECT trx_mysql_thread_id FROM information_schema.INNODB_TRX);
-- 必要时终止(谨慎评估回滚代价)
-- KILL 连接号;

输出逐列读法

字段含义判读
trx_state事务状态等待锁说明存在阻塞,回滚中说明正在付出代价
trx_started事务开始时间最早的那个通常是锁事故源头
trx_rows_modified已修改行数数值大意味着回滚代价高
trx_mysql_thread_id关联连接号用于定位应用与执行终止操作
trx_query当前语句为空的活跃事务说明开了事务却没在跑语句
长事务不只是性能问题:它会拖慢回滚段清理、阻止表结构变更、并显著放大行锁范围。
终止大事务前要评估回滚时间:中断一个改了数百万行的事务,回滚本身可能持续数分钟并持续占用资源。

易错点

  • 只看当前语句不看开始时间:它可能是几分钟前就开启、现在正在等锁的老事务
  • 把长事务当纯性能问题:它同时拖慢清理、阻塞表结构变更
  • 开事务后忘记提交:连接池复用连接时事务持续存在,锁越积越多
  • 批量任务一次提交过多行:单事务过大,回滚与锁的影响都被放大

数据来源与参考

  • MySQL 8.0 Reference Manual: INFORMATION_SCHEMA INNODB_TRX

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌