指定@Transactional回滚是否也包括运行时异常

2022-09-01 15:46:43
@Transactional(rollbackFor = MyCheckedException.class)
public void foo() {
    throw new RuntimeException();    
}

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


答案 1

无需包含在列表中。即使您不提及它,它也会处理它。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");
}
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

答案 2

但是,请注意,默认情况下,Spring Framework的事务基础结构代码仅在运行时未检查的异常情况下将事务标记为回滚;也就是说,当引发的异常是 RuntimeException 的实例或子类时。(默认情况下,错误也会导致回滚。从事务方法引发的已检查异常不会导致事务回滚。