我有一个事务方法,我想调用另一个可能引发RuntimeException的方法。
问题在于,仅在引发异常时,事务才会被标记为rollbackOnly。
另一个方法调用本身位于try-catch块中,但是我认为当另一个方法通过抛出异常返回时,事务会被标记。
示例:
MyService.java
@Service
public class MyService {
@Autowired
private MyUtils utils;
@Autowired
private MyCrudRepository repository;
@Transactional
public void publicMethod() {
try {
utils.otherPublicMethod();
} catch (Exception ex) {
ex.printStackTrace();
}
// RollbackException: Transaction marked as rollbackOnly
// Even though I caught the exception from the method call itself
repository.save(new MyEntity());
}
}
MyUtils.java
@Component
public class MyUtils {
// Does not use transactions, repositories
// But I think it inherits the transaction and marks it as rollbackOnly
public void otherPublicMethod() {
// Maybe this is seen as an uncaught exception
throw new RuntimeException();
}
}
编辑:
我认为这不是Does Specifying @Transactional rollbackFor Also Include RuntimeException的重复,因为最终会捕获到异常。
该问题可能相似,因为它还涉及事务和回滚。
答案 0 :(得分:0)
注释@Transactional
具有诸如rollbackFor
和no-rollback-for
之类的参数,您可以使用它们来说明哪些异常将导致或将不会导致回滚。例如,您可以编写:
@Transactional(rollbackFor = {RuntimeException.class})
这将导致在RuntimeException
上回滚。但是,我相信RuntimeException
默认会导致回滚。因此,您可能必须在no-rollback-for
子句中指定此异常。
有关详细信息,请参见Transaction Management并查找“ 16.5.5设置”段落