长事务观测是什么
事务观测表列出当前活跃事务:开始时间、状态、已修改行数、关联连接与当前语句。它是排查锁等待与阻塞的第一现场:开始时间最早的那个事务,通常就是锁事故的源头。把「事务年龄」做成告警,比事故后翻日志高效得多。
基本信息
| 数据来源 | 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 | 当前语句 | 为空的活跃事务说明开了事务却没在跑语句 |
长事务不只是性能问题:它会拖慢回滚段清理、阻止表结构变更、并显著放大行锁范围。
终止大事务前要评估回滚时间:中断一个改了数百万行的事务,回滚本身可能持续数分钟并持续占用资源。