指定@Transactional rollbackFor还包括RuntimeException

时间:2012-10-11 00:14:18

标签: java spring exception transactions rollback

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

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

3 个答案:

答案 0 :(得分:13)

无需在RuntimeException列表中加入rollbackFor。即使你没有提到它,它也会处理它。

我已经尝试过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");
}
Output:
After Insertion:
1 Deepak 35000
2 Yogesh 35000
3 Aditya 35000

update exception
After Update
1 Deepak 35000
2 Yogesh 35000
3 Aditya 35000

答案 1 :(得分:9)

  

但是,请注意Spring Framework的事务   默认情况下,基础架构代码仅标记事务   在运行时回滚,未经检查的异常;也就是说什么时候   抛出的异常是RuntimeException的实例或子类。   (错误也将 - 默认情况下 - 导致回滚。)已检查   不会导致从事务方法抛出的异常   在正在回滚的交易中。

Source

答案 2 :(得分: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();
    }
}