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上说已经抛出了异常,得回滚!
知道了原因,解决这个异常那就简单了
那还有一个问题,如果就按照最原始的写法,抛出了Transaction rolled back because it has been marked as rollback-only这个异常,那整个事务到底是什么情况呢?是回滚了,还是正常提交了?
答案是回滚了!
上面的问题,其实整体来说,就是错误的使用了事务管理。
那除了上面的问题,还会有什么情况会导致事务管理失效呢?
美团二面:spring事务不生效的15种场景