org.springframework.dao.CannotAcquireLockException异常处理
背景
测试环境由于数据量不大,请求并发量也不大,所以有非常多的隐藏问题。由于线上环境单数据量暴增,导致死锁的发生,这非常致命,有时还会导致项目的占用的CPU升高以及内存的飙升,CannotAcquireLockException算是最近很经常看见的问题。
造成的原因1:
Spring事务嵌套,当前的业务方法中在一个事务中执行,但是这个方法里还存在调用其他方法,可能也加了事务,底层报错时,事务回滚造成死锁。
当时我也以为是这个问题,所以对一直存在CannotAcquireLockException的接口进行排查,但是始终发现应该不是这个问题。
如果你是这种情况,请妥善处理这之间的关系,改掉写法也好,或者如果另一个业务逻辑不重要,可以开一个线程去执行。
造成的原因2:
查询性能太慢,数据库压力太大,对象被锁定,导致事务出现问题。
解决办法:优化sql查询(找出有可能涉及该表的查询,尽可能优化查询速度)