Mysql : Lock wait timeout exceeded 解决方案

方案来源于:https://blog.csdn.net/zmx729618/article/details/51259135

上周在写递归遍历比较两棵树的差异的需求:代码在遍历查询后update db的时候遇到一个mysql的报错: ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

google了下,发现文章大同小异,但是真正解决我问题的是上面链接中的文章,

结论是:mysql 默认都是自动提交的,可以用select @@autocommit 查看是否为自动提交,如果不是的话, set global autocommit=1;

定位过程:发现实际的数据量并不大,而update的时候,进程状态一直是updating卡住的。

原来autocommit 这个参数配置值为0, 这个设置导致原来的update语句如果没有commit的话,你再重新执行update语句,就会等待锁定,当等待时间过长的时候,就会报ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction的错误。(因为我是递归update,而配置又是autocommit=0, 所以等待锁定)

临时解决方案: 赶紧commit刚才执行的update语句,之后 set global autocommit=1;

最终解决方案:出现该问题大多数是因为出现死锁或者connection/session没有关闭造成的,去检查执行该sql的语句,检查是否有finally{}中关闭连接