如何回滚嵌套事务?假设如果method5中有异常,那么如何也回滚method4更改。
@Singleton
public class Case {
@Inject
CaseService caseService;
@Transactional
void method2(){
var value = caseService.method4();
caseService.method5(value);
}
}
@Singleton
public class CaseService {
@Transactional(Transactional.TxType.REQUIRES_NEW)
public String method4(){
return "some";
}
@Transactional(Transactional.TxType.REQUIRES_NEW)
public void method5(String value){
}
}发布于 2021-10-20 13:49:44
如果您想回滚method4调用,那么它的语句应该与method5在同一个事务中。
在您提供的代码中,method4和method5始终在单独的事务中执行。
因此,您可以删除REQUIRES_NEW属性。
发布于 2021-10-20 14:02:28
REQUIRES_NEW将始终创建新事务,而不考虑以前的任何事务。因此,任何回滚都将只发生在该事务上。你想要所有的(method4,method5)意味着method2应该是原子的。在这种情况下,所有这些都应该在相同的事务下,这意味着你只需要使用REQUIRED,或者根据你的用例在method2和method4和method5上启动一个新的事务。
如果您的任何事务性方法抛出RuntimeException,那么它们将自动回滚。如果您还期望检查异常的回滚,那么您需要在注释中提到这一点。
(rollbackFor=CustomException.class)
https://stackoverflow.com/questions/69632021
复制相似问题