Mysql 报错 Lock wait timeout exceeded; try restarting transaction 问题解决方法


Spring 事务嵌套造成死锁

在高并发的情况下,Spring事物造成数据库死锁,后续操作超时抛出异常。 
Mysql数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。

这个mysql死锁现象主要是添加、修改或删除的操作添加了事务(添加了@Transactional注解或者是配置文件进行了配置),然后出异常的时候catch捕获了,导致事务没有收到异常一直在等待着,没有结束,也不会触发回滚操作,所以导致表被锁。

在catch里把异常给抛出来,让事务能触发回滚,释放表的锁资源:throw new RuntimeException(e);

 

或者:当前调用事务的方法设置为 Propagation.SUPPORTS: @Transactional(propagation=Propagation.SUPPORTS)

 

 或者 通过下面语句查找到为提交事务的数据,kill掉此线程即可。

select * from information_schema.innodb_trx

kill 20057;

 

posted on 2021-08-19 16:36  Lucky~Suri  阅读(1167)  评论(0编辑  收藏  举报