org.springframework.dao.CannotAcquireLockException异常处理

背景

在这里插入图片描述

测试环境由于数据量不大,请求并发量也不大,所以有非常多的隐藏问题。由于线上环境单数据量暴增,导致死锁的发生,这非常致命,有时还会导致项目的占用的CPU升高以及内存的飙升,CannotAcquireLockException算是最近很经常看见的问题。

造成的原因1:

Spring事务嵌套,当前的业务方法中在一个事务中执行,但是这个方法里还存在调用其他方法,可能也加了事务,底层报错时,事务回滚造成死锁。

当时我也以为是这个问题,所以对一直存在CannotAcquireLockException的接口进行排查,但是始终发现应该不是这个问题。

如果你是这种情况,请妥善处理这之间的关系,改掉写法也好,或者如果另一个业务逻辑不重要,可以开一个线程去执行。

造成的原因2:

查询性能太慢,数据库压力太大,对象被锁定,导致事务出现问题。

解决办法:优化sql查询(找出有可能涉及该表的查询,尽可能优化查询速度)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐