异常com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
异常现象
抛出异常:com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
解释:MYSQL事务回滚异常,超过锁等待超时;尝试重新启动事务
原因:执行update的SQL语句时,由于表被锁住,无法更新,导致时间超时;
此时在数据库对当前表进行update语句更新时,会提示:时间超时
当执行一个方法请求到数据库,抛出当前异常时,即使定位到执行的是哪一条SQL语句。确定是哪一张表;
MYSQL中手动执行该update语句时,提示:失败,等待锁超时;
解决方案:
1、查看数据库被锁表的进程,若表被锁住,可以查看到当前锁表的进程信息,若表被一直锁住不释放,则信息会一直存在;
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2、找到当前锁表的进程ID,即:trx_mysql_thread_id,将其终止
kill 进程ID;
此时当前表会被释放,即可正常进行update操作。
以上只是解决锁表的临时解决方案,并不推荐,应该从造成锁表的原因去调整,避免后续执行方法时也会锁表;
拓展:
1、查看未提交的事务
select * from information_schema.INNODB_TRX;
2、查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
3、查看正在等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
参考:https://blog.csdn.net/lejustdoit/article/details/120276851