首页/数据/SQL 速查/长事务与悬挂事务的危害
变更与事务52 条

长事务与悬挂事务的危害

长时间不提交的事务会拖住清理与统计:InnoDB 的 purge、PostgreSQL 的 vacuum 都被迫保留旧版本,还可能与 DDL 相互阻塞。

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

长事务是什么

长时间不提交的事务会拖住整个存储引擎的清理工作:InnoDB 的 purge 无法回收旧版本,历史链表与回滚段持续增长;PostgreSQL 的 vacuum 无法回收死元组,表与索引一起膨胀。长事务还容易与 DDL 相互阻塞,把锁等待传导给线上请求。

基本信息

InnoDB 影响阻止 purge 回收旧版本,回滚段与历史链表膨胀
PostgreSQL 影响阻止 vacuum 回收死元组,表与索引膨胀
常见来源连接池里开了事务忘了提交,形成 idle in transaction
排查 MySQLinformation_schema.INNODB_TRX 按 trx_started 排序
排查 PGpg_stat_activity 里 xact_start 非空、状态为 idle in transaction
护栏PG 可设 idle_in_transaction_session_timeout;应用层必须保证提交或回滚

MySQL 排查

MySQL 排查
SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query
FROM information_schema.INNODB_TRX
ORDER BY trx_started;   -- 最上面一行就是活得最久的事务

SELECT id, user, db, command, time, state, info
FROM information_schema.PROCESSLIST
WHERE time > 60
ORDER BY time DESC;     -- 看具体连接在做什么

PostgreSQL 排查

PostgreSQL 排查
SELECT pid, state, xact_start,
       now() - xact_start AS age,
       state_change,
       query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
ORDER BY xact_start;   -- 重点看 state = 'idle in transaction' 的行

危害与对照

维度MySQL 8(InnoDB)PostgreSQL
清理机制purge 回收旧版本vacuum 回收死元组
受影响对象回滚段与历史链表膨胀表与索引膨胀
排查视图information_schema.INNODB_TRXpg_stat_activity
常见元凶连接池里未提交的事务idle in transaction 会话
护栏手段靠应用层与连接池管理idle_in_transaction_session_timeout

典型使用场景

  • 排查库变慢:先看有没有长事务挂着
  • 连接池治理:找出开了事务却不提交的连接
  • 上线前检查:确认待执行的 DDL 不会被长事务挡住
  • 批量作业调优:把大事务拆成小批次
  • 数据同步任务:避免在事务里调用外部接口
  • 容量告警排查:表膨胀时先排除长事务因素
长事务不一定正在跑语句:idle in transaction 表示事务已经开启但当前没有 SQL 执行,它同样阻止清理。排查时状态列比耗时列更值得关注。
在事务里做网络调用是典型隐患:接口超时或重试会把事务拖到几十秒以上,锁与清理都被牵连。外部调用应放在事务之外,数据准备完再开启事务写库。

易错点

  • 连接池里开了事务忘提交:以 idle in transaction 形式长期挂着,是最常见的长事务来源
  • 把大事务当成“一次做完更安全”:日志与锁占用暴涨、清理受阻,失败重试代价也大,拆小批次更稳
  • 在事务里调用外部接口:接口超时会把事务拖长,应把外部调用挪到事务外
  • 只按耗时排查:闲置事务的耗时未必直观,要结合事务开始时间与状态一起看

数据来源与参考

  • MySQL 8.0 Reference Manual · InnoDB Trx
  • PostgreSQL Documentation · Routine Vacuuming
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌