解决:Cause java.sql.SQLException Lock wait timeout exceeded; try restarting transaction; SQL []; Lock
解决:Cause java.sql.SQLException Lock wait timeout exceeded; try restarting transaction; SQL []; Lock wait timeout exceeded; try restarting transaction; nested exception is java.sql.SQLException Lock wait timeout exceeded; try restarting transaction
前一段时间发现了这个问题,分享下解决思路
这个问题说的是你的表被锁了,具体哪个表被锁了你要看自己的情况,反正就是表被锁了(数据库有事务没有提交,那个线程处于sleep装态,我们需要把这个线程找出来,然后把它kill掉)
- 到自己的数据库中,打开
information_schema
中的INNODB_TRX
表,查看他的内容,select * from information_schema.INNODB_TRX;
- 把查找到的数据中的
trx_mysql_thread_id
杀死就ok了。
开始上图:
-
一开始我查是没有事务,
-
开启一个事务,
-
这个事务先在执行中,不提交和回滚,然后去查
INNODB_TRX
表,发现有记录,而不是空的。 -
执行一条和事务中update同样的表发现会超时
-
然后执行的update这个表的时候,查
INNODB_TRX
表会出现一个LOCK_WAIT状态的记录,看到trx_query中的sql就是我们刚刚执行的update,一直处于锁等待状态,然后就会超时,因为有一个running状态的为提交的事务。-
使用
show processlist;
命令可以查看trx_mysql_thread_id对应的线程列表中是不是有这个线程id。command为sleep状态。
-
开始解决问题,
-
这里可以通过rollback;commit;方式回滚或提交当前事务,但是我们开发中,都是用Spring这样的框架,所以我们用第二种方法kill掉这个线程就好了,kill [id];这里的id是你刚放查询
INNODB_TRX
表中的trx_mysql_thread_id。