@Transactional(rollbackFor = MyCheckedException.class)
public void foo() {
throw new RuntimeException();
}
此事务会回滚,还是我还需要在注释中包含 RuntimeException.class?
@Transactional(rollbackFor = MyCheckedException.class)
public void foo() {
throw new RuntimeException();
}
此事务会回滚,还是我还需要在注释中包含 RuntimeException.class?
无需包含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");
}
输出: 插入后: 1 迪帕克 35000 2 约格什 35000 3 阿迪亚 35000 更新异常 更新后 1 迪帕克 35000 2 约格什 35000 3 阿迪亚 35000
但是请注意,Spring 框架的事务基础代码默认情况下只会在运行时、未经检查的异常情况下将事务标记为回滚;也就是说,当抛出的异常是 RuntimeException 的实例或子类时。(默认情况下,错误也会导致回滚。)从事务方法抛出的检查异常不会导致事务回滚。
因此它也可以使用 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();
}
}