今天在公司修复一个小bug,一个数据在修改后没有实时的存储起来,直接改代码,修改后通过mysql语句存储起来,但是测试的时候,mysql老是存储不成功,明明看到sql语句已经执行但是通过Navicat连到数据库去看,数据还是没有更新。然后通过看代码,原来mysql查询没成功,返回1205错误,网上一查 Lock wait timeout exceeded; try restarting transaction大概原因是死锁了 ,上一个事务一直没有提交,导致一直在那等待。
先看下mysql线程 show processlist,由于是开发测试机,连接太多了,根本不好看到我的连接。直接使用mysql语句查看
select id,user,host,db,Command,State,time from information_schema.processlist where db='我的数据库';
没有看到正在执行的慢查询,网上搜索说可以查information_schema.innodb_lock_waits这张表,可以直接看到死锁的状态,但是,貌似mysql5.5以上才有,我们用的5.1,悲剧。
后来发现凡是涉及到那张表的操作全返回1205,那肯定是死锁了。仔细看上面的连接线程,有两个host不一样,且其一直是sleep状态,很有可能就是开始事务后,没有提交,一直sleep了。而且那两个连接就是Navicat通过我本机连到的数据库,有可能我在Navicat中有些误操作,然后又不管了强制关闭了。可以试试直接kill这些线程。
直接kill 上面的线程 ,mysql语句执行成功了!!