jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

本文探讨了在SpringBoot项目中,由于事务服务间的互相调用和Mysql的默认可重复读隔离级别导致的死锁问题。解决方法包括合并事务或在必要时显式提交事务2。
摘要由CSDN通过智能技术生成

背景

spring boot项目中,事务service1通过webservice调用了另一个微服务service2接口,而servcie1和service都操作同一条数据,造成死锁;

原因分析

因为两个是独立事物,同时Mysql数据库的隔离级别是默认的可重复读。这就导致,service1.func1  开启的事物(我们称其为事物1),插入数据库,还没提交时,此时被插入的行处于被锁定状态;service1.func2 开启的新事物(我们称其为事物2),因为不在同一个事物中,需要等待被插入的行解锁,即需要等待事物1提交完事物后,才能更新。

这个时候,问题已经很明显了。事物1还在等待事物2的函数返回结果,然后才提交。那么,结果只能是事物2和事物1都无限期等待下去,即死锁--》出发数据库对死锁的处理方式:超时检测--》抛出异常。

MySQL默认的锁超时等待为50s,可以通过innodb_lock_wait_timeout 参数查看和修改。

 
show VARIABLES like '%innodb_lock_wait_timeout%' ;

即如果数据库锁超过50s还未被释放,则会触发该超时机制,抛出错误并回滚。

解决办法

方案1:如无必要,将事物1和事物2合并为同一个事物

方案2:如无法合并,则改为事物1提交(如手动显示提交)后再调用事物2。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值