下面是我的方法的结构:

    @Override
    @Transactional
    public methodOuter(){
      //some processing
      methodInner1();
      methodInner2();
    }

    @Override
    @Transactional
    public methodInner1(){
    //save something to db
    }

    @Override
    @Transactional
    public methodInner2(){
    //some processing
    //throws exception
    }


方案是methodInner1()已成功处理,但methodInner2()引发异常。所以我想回滚在methodInner1()中完成的提交。当前methodInner1()中的提交不会回滚。我希望methodOuter()进行单笔交易

最佳答案

如果您知道引发异常的类型(假设其为NPE),则可以尝试类似

@Override
@Transactional(rollbackOn=NullPointerException.class)
public methodOuter(){
  //some processing
  methodInner1();
  methodInner2();
}

@Override
public methodInner1(){
  //save something to db
}

@Override
public methodInner2(){
  //some processing
  //throws exception
}


在这种情况下,您无需注释“内部”功能。如果抛出NullPointerException,则methodOuter将回滚。如果要针对所有可能的异常回滚,则应将注释更改为

@Transactional(rollbackOn=Exception.class)


顺便说一句:RuntimeExceptions将导致回滚,无论它们是否带有注释。

07-27 13:48