mysql长事务的处理

1、排查业务端

  1)业务是否确实需要使用长事务

     比如:删除不必要的只读事务。

 2)对使用长事务的代码检测是否有自动提交事务(可在mysql的general_log中查看是否开启);

  注意:最好在业务功能测试时输出general_log,分析日志行为提前发现问题。

    自动提交-setAutoCommit=1;

    查看是否开启事务:

show variables like 'general_log'; 

show variables like 'general_log_file'; 

show variables like '%log%'; 


set global general_log = ON;

      

  3)确实需要的,需确认 业务端 是否设置执行时间,对事务超时异常是否有处理

    设置时间:对业务本身的预估执行时间设置,setMaxExecutionTime命令或 transactionTemplate-setTimeout,

2、排查数据端

 1)监控information_schema.innodb_trx 表,设置长事务阈值,超过就报警或者kill

   排查表:INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS

   参考文档:http://blog.itpub.net/12679300/viewspace-1420031/

2)percona的pt-kill工具

从show processlist 中读取满足条件的连接执行操作。

参考文档:percona-https://www.cnblogs.com/keme/p/10239838.html

3)使用mysql5.6或更新版本时,可设置innodb_undo_tablespaces设置成2(或更大的值),方便大事务回滚段清理。

发布了18 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Annie_ya/article/details/104938829