@Transactional(rollbackFor = MyCheckedException.class)
public void foo() {
throw new RuntimeException();
}
此事务是否会被回滚,还是我还需要在注释中包含RuntimeException.class?
答案 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的实例或子类。 (错误也将 - 默认情况下 - 导致回滚。)已检查 不会导致从事务方法抛出的异常 在正在回滚的交易中。
答案 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();
}
}