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

长事务与悬挂事务的危害

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

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

排查

排查
-- MySQL:按开始时间找长事务
SELECT trx_id, trx_started, trx_state, trx_mysql_thread_id
FROM information_schema.INNODB_TRX
ORDER BY trx_started;

-- PostgreSQL:找空闲事务与长事务
SELECT pid, state, xact_start, now() - xact_start AS age, query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
ORDER BY xact_start;
InnoDB长事务阻止 purge,历史链表长度增长,回滚段膨胀
PostgreSQL长事务阻止 vacuum 回收死元组,表与索引膨胀
护栏PG 设 idle_in_transaction_session_timeout;MySQL 监控 Sleep 连接与 INNODB_TRX

易错点

  • 连接池里“开了事务忘提交”的连接会以 idle in transaction 形式长期挂着,是线上最常见的长事务来源
  • 批量作业拆小事务不只是并发考虑,也让失败重试代价可控

数据来源与参考

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