SHOW VARIABLES LIKE 'autocommit';
SELECT trx_mysql_thread_id, trx_state FROM information_schema.innodb_trx;

接口偶发超时,日志显示同一个连接上先执行了 update 然后直接归还,下一个请求拿到这条连接查同一行时被锁住,等了 50 秒报 1205。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:连接归还时事务没提交也没回滚,连接池只做了状态重置,锁仍挂在这条会话上。下一个请求复用同一个连接,看到的还是上一个事务的上下文。ORM 里手动开事务又提前 return 的路径最容易出这种问题。

围绕「事务未提交连接复用」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。

处理上按这个顺序:在连接池配置里开启归还时回滚 多数池都有这个开关;检查代码里手动 begin 的分支 保证 finally 里提交或回滚;默认开启自动提交 只对明确需要事务的方法手动控制;用 data_locks 的 THREAD_ID 对上连接池里的连接。

确认没问题再收工,连接归还后 innodb_trx 里不再残留该线程的事务 后续请求不会莫名等待。

作者 9823189