踩坑日记-Transaction rolled back because it has been marked as rollback-only

使用场景:

方法A调用方法B,方法A上加了@Transactional注解,方法B上也加了@Transactional注解,方法B会抛出异常,方法A捕获到异常但是不抛出,就会出现这个报错。

@Transactional
public ReturnType A(Object object){
      //业务代码...
     try{
        B(Object);
    }catch(Exception e){
        //捕获执行过程中出现的任何异常,且正常返回
        return new ReturnType();
    }    

}

@Transactional
public void B(Object object){
    try{
        //执行业务操作
    }catch(Exception e){
        //记录日志
        throw e;
    }
}

原因

@Transactional注解是基于AOP实现的,且是可继承的,A和B实际上是在同一个事务中,加上@Transactional注解后会在方法结束之后执行commit/rollback。方法B抛出了异常,此时事务状态被设置成了rollback,而上层A方法却没有将这个异常抛出去,此时事务认为应该commit,就会报错。

 

解决

方法B新启一个事务,改为@Transactional(propagation = Propagation.REQUIRES_NEW)

posted @ 2021-03-17 17:13  西瓜味的可乐酱  阅读(302)  评论(0)    收藏  举报