关于事务的一点思考--谈谈Transaction rolled back because it has been marked as rollback-only

Transaction rolled back because it has been marked as rollback-only

在使用事务的时候,代码里会爆出上面的错误

什么原因呢?
方法A调用了方法B。
且方法A和方法B上都启动了事务。(都标注了@Transactional)
方法B抛出了异常。
方法A收到B的异常后直接吃掉了,没有继续抛出。

问题就出现在异常上
在上面的默认情况下,Spring 是让方法AB 公用一个事务。
但是Spring 已经感知到了方法B的异常,然后在方法A里面,代码逻辑吃掉了异常,当A结束的时候,Spring并没有感知到A的异常,就准备提交事务。这就冲突了。
从A上说方法一切正常,可以提交!
从B上说已经抛出了异常,得回滚!

知道了原因,解决这个异常那就简单了

  • 如果希望整个流程都能正常提交:那就在b里面把异常吃掉,不要让Spring感知到异常。
  • 如果希望整个流程直接回滚:那就不要在A里吃掉异常,让Spring感知到异常。

那还有一个问题,如果就按照最原始的写法,抛出了Transaction rolled back because it has been marked as rollback-only这个异常,那整个事务到底是什么情况呢?是回滚了,还是正常提交了?

答案是回滚了!

上面的问题,其实整体来说,就是错误的使用了事务管理。
那除了上面的问题,还会有什么情况会导致事务管理失效呢?
美团二面:spring事务不生效的15种场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值