Sunday面试指南

MySQL 长事务有什么危害?怎么发现和处理一直不提交的事务?

以下对话为教学模拟,不是真实面经。

🧑‍💻 面试官:MySQL 长事务有什么危害?

🙋‍♂️ 我:会占锁,影响其他事务。

🧑‍💻 面试官:一个只查询的事务,也可能有影响吗?连接显示 Sleep,就一定没有事务吗?

长事务的问题不只在于“SQL 执行得慢”,还在于事务状态长期没有结束。

面试速答(60 秒版)

长事务指事务持续很久没有结束,不一定是某条 SQL 一直执行。应用查询以后等用户操作,也可能让事务长时间保持打开。

它可能长期持有锁,也可能保留较老的一致性读取视图,使某些历史版本无法及时清理,增加 undo 历史和系统压力。

排查时,我会查看 InnoDB 活跃事务、开始时间、当前语句以及锁等待,再与连接和应用请求关联。Sleep 连接也可能有未提交事务,不能只看正在执行的 SQL。

处理时先确认业务、持锁和回滚成本,再决定提交、回滚或终止连接。长期治理要缩小事务范围、设置超时和补齐监控,不是看到时间长就直接 kill。

速答总览:长事务是长期未结束的事务状态,可能影响锁与历史清理,处理必须考虑业务和回滚成本。

知识点详解:没有在执行 SQL,也可能留下一个很老的事务

先区分慢 SQL 与长事务

咱们假设应用开启事务,查询订单,再等待用户确认。查询可能只用了几毫秒,但用户迟迟没有操作,事务一直没有提交。

慢查询统计可能看不出这个问题,因为没有一条 SQL 持续很长时间。事务却仍然占用相应状态和资源。

MySQL 的事务信息说明提供了 InnoDB 活跃事务与等待信息的入口。因此,监控不能只关注单条 SQL 耗时,也要关注事务年龄。

查询执行时间和事务持续时间分开观察

锁与旧版本,分别造成不同压力

修改数据的事务可能持有记录锁,让其他事务等待。具体是否持锁、持有什么锁,要看实际语句和隔离级别。

读取事务则可能保留一致性读取需要的历史版本。并不是“长事务让所有 undo 都不能清理”,而是有些版本仍被旧读取视图需要,清理进度受到约束。

MySQL 的 purge 文档解释了清理相关配置与影响。历史长度上升是一个观察信号,不能仅凭一个指标就锁定某个连接;写入速率和清理能力也会影响它。

旧读取视图可能约束历史版本清理

两组历史按“是否仍被读取视图需要”分类,不表示同一版本链的时间先后。

用事务记录,找回对应连接

可以先查询活跃事务的时间和连接信息,再结合 Performance Schema 或 processlist 找到实际会话。下面为只读排查示例,字段与权限需要按数据库版本确认。

SELECT trx_id, trx_started, trx_state,
       trx_mysql_thread_id, trx_query
FROM information_schema.innodb_trx
ORDER BY trx_started;

trx_query 为空,不等于事务不存在。会话可能现在空闲,但以前开启的事务仍未结束。连接状态为 Sleep,也不能自动排除这种情况。

继续检查锁等待、应用日志和请求标识,确定是谁开启事务、为什么没有结束。事务开始时间很早,但当前没有明显阻塞,和正在锁住核心写入的事务,处理优先级不同。

终止之前,要考虑回滚本身的代价

如果事务修改了很多数据,回滚可能需要时间。终止连接不代表所有影响立刻消失,相关清理也需要完成。

因此,应先确认业务是否允许中断,记录诊断信息,再与负责方决定处理方式。不能把一条 kill 命令作为普适修复,更不能在没有确认时对生产会话执行它。

如果问题源于连接归还池之前没有提交或回滚,要修复资源管理。连接池复用可以让问题延续到其他请求,单次终止只能缓解现象。

把事务范围缩到真正需要原子性的部分

不要在数据库事务里等待用户输入、执行长时间外部请求或做大量无关计算。

可以在事务外准备数据,在短事务中完成必须一致的检查和修改;确实需要跨步骤业务状态时,用明确状态与补偿机制组织,不让数据库连接替整个业务流程无限等待。

最后增加事务年龄、锁等待、回滚耗时和历史清理等监控,并测试异常路径。只给正常路径添加 commit,不检查超时和异常是否 rollback,仍然可能留下长事务。

面试官继续追问

只读事务是不是一定无害?

不是。是否影响历史清理,要看读取视图、隔离级别和执行方式。但也不能说任何只读查询都会永久保留旧版本。

长事务一定会锁住整张表吗?

不一定。锁范围由实际操作、索引和隔离机制等决定;长只是持续时间描述,不是锁类型。

处理以后怎样确认恢复?

继续观察等待、活跃事务、回滚和历史清理趋势,并检查业务请求。连接消失只是一个事实,不是全部恢复证明。

面试速记卡

  • 长事务:事务状态持续,不等于一条慢 SQL。
  • 两类压力:锁等待与历史版本清理受影响。
  • 空闲边界:Sleep 连接也可能保留未结束事务。
  • 处理原则:先确认业务与回滚成本,再决定中断。
  • 长期治理:缩小事务范围,覆盖异常和资源释放。

公司面试真题

这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历