最近公司的一个项目上线,测试、准生产环境测试都正常,但是生产测试当天就出现了**“Transaction rolled back because it has been marked as rollback-only”**
代码逻辑很简单:
try{
方法B
}catch(Exception e){
//异常打印
}
方法B就是为了去获取与第三方交互的公钥,先取本地缓存,无缓存就取数据库。
就是这里!!
运维人员只是清除了缓存中value并没有把key删除,导致方法B代码逻辑出现空指针异常(自己菜,没有做null判断,朋友们一定要多注意空指针判断!),然后异常被try捕获了,但是没有做处理,所以出现了spring事务嵌套回滚的异常!
网上有很多解决方案,大致总结下:
方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理
方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常。
多学习,多思考~
本文记录了一次生产环境中遇到的事务回滚异常问题,由于运维误操作导致缓存中值丢失,触发空指针异常。在try-catch中未处理异常,最终引发“Transaction rolled back because it has been marked as rollback-only”。作者分享了两种解决策略:1) 在service层不捕获异常或抛出运行时异常;2) 手动设置事务回滚。提醒开发者注意异常处理和空指针判断的重要性。

被折叠的 条评论
为什么被折叠?



