小编给大家分享一下mysql怎么避免长事务,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
1、确认是否使用了set autocommit=0。
这个确认工作可以在测试环境中开展,把 MySQL 的 general_log 开起来,然后随便跑一个业务逻辑,通过 general_log 的日志来确认。
2、确认是否有不必要的只读事务。
有些框架会习惯不管什么语句先用 begin/commit 框起来。有些是业务并没有这个需要,但是也把好几个 select 语句放到了事务中。这种只读事务可以去掉。
3、业务连接数据库的时候,控制每个语句执行的最长时间,避免单个语句意外执行太长时间。
实例
#!/bin/bash mysql -N -h227.0.0.1 -userver_234 -pserver_234 -P8002 -e "select now(),(unix_timestamp(now()) - unix_timestamp(a.trx_started)) diff_sec,b.id,b.user,b.host,b.db,d.sql_text from information_schema.innodb_trx a inner join information_schema.processlist b on a.trx_mysql_thread_id=b.id and b.command = 'sleep' inner join performance_schema.threads c on b.id = c.processlist_id inner join performance_schema.events_statements_current d on d.thread_id = c.thread_id;" | while read a b c d e f g h do if [ "$c" -gt 30 ] then echo $(date +"%y-%m-%d %h:%m:%s") echo "processid[$d] $e@$f in db[$g] hold transaction time $c sql:$h" fi done >> /tmp/longtransaction.txt
看完了这篇文章,相信你对“mysql怎么避免长事务”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。