MySQL 监控和处理长事务
什么是长事务 ?
长事务,是指事务开启后长时间未结束(commit或者rollback都没执行)。出现长事务的原因有很多,例如:
- 事务中有一个慢查询;
- 就是忘记结束事务了;
- 一个长事务中锁住了一些资源,导致其他需要该资源的事务也变成长事务。
很多情况下,长事务,会对业务产生很大的负面影响:
- 业务响应太慢。
- 连接数暴涨。
如何发现长事务?
用下面的 SQL :
select
t.*,
to_seconds(now()) - to_seconds(t.trx_started) idle_time
from INFORMATION_SCHEMA.INNODB_TRX t
查询结果中,idle_time 过大的事务就是长事务。输出结果中, trx_mysql_thread_id
是对应的线程标识。
如何干掉长事务?
方案1
从 INFORMATION_SCHEMA.INNODB_TRX
得到的长事务信息中,有对应的线程标识, kill 掉即可。
方案2
设置较小的 wait_timeout
可以干掉部分长事务。
对于业务代码,使用的是非交互模式的连接,可以使用 wait_timeout
设置超时时间。相当于,若某个连接在 wait_timeout
这个时间范围内是空闲的,MySQL 服务器会自动关闭连接。
注意,数据库连接池参数要根据情况调整下。