下面是我的方法的结构:
@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将导致回滚,无论它们是否带有注释。