try catch使用导致出现“Transaction rolled back because it has been marked as rollback-only”问题解决

本文记录了一次生产环境中遇到的事务回滚异常问题,由于运维误操作导致缓存中值丢失,触发空指针异常。在try-catch中未处理异常,最终引发“Transaction rolled back because it has been marked as rollback-only”。作者分享了两种解决策略:1) 在service层不捕获异常或抛出运行时异常;2) 手动设置事务回滚。提醒开发者注意异常处理和空指针判断的重要性。

最近公司的一个项目上线,测试、准生产环境测试都正常,但是生产测试当天就出现了**“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();语句,手动回滚,这样上层就无需去处理异常。

多学习,多思考~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值