25
@Transactional(rollbackFor = MyCheckedException.class)
public void foo() {
    throw new RuntimeException();    
}

此事务会回滚,还是我还需要在注释中包含 RuntimeException.class?

4

3 回答 3

25

无需包含RuntimeExceptionrollbackFor列表中。即使您不提及它,它也会处理它。

我已经为 jdbcTemplate 尝试过:-

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = MyException.class)
public void updateSalary(final int increment){
    jdbcTemplate.update("update EMPLOYEE set emp_salary = emp_salary + ?", increment);
    throw new RuntimeException("update exception");
}
输出:
插入后:
1 迪帕克 35000
2 约格什 35000
3 阿迪亚 35000

更新异常
更新后
1 迪帕克 35000
2 约格什 35000
3 阿迪亚 35000
于 2012-10-11T04:59:29.590 回答
9

但是请注意,Spring 框架的事务基础代码默认情况下只会在运行时、未经检查的异常情况下将事务标记为回滚;也就是说,当抛出的异常是 RuntimeException 的实例或子类时。(默认情况下,错误也会导致回滚。)从事务方法抛出的检查异常不会导致事务回滚。

来源

于 2012-10-11T05:45:11.277 回答
4

因此它也可以使用 CheckedException 回滚(默认为 RuntimeException),例如:

@Transactional(rollbackFor = Exception.class)
public void save(Book book) throws Exception {
    bookRepository.save(book);
    System.out.println("Saved in transcation.");
    // No data is persisted
    if (true) {
        throw new Exception();
    }
}
于 2017-07-17T15:37:25.350 回答