指定@Transactional rollbackFor还包括RuntimeException

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

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

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

我已经尝试过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 Deepak 35000
 2 Yogesh 35000
 3 Aditya 35000

更新例外
更新后
 1 Deepak 35000
 2 Yogesh 35000
 3 Aditya 35000

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

资源

这可能有所帮助: 使用已检查和未检查的exception进行Spring事务管理

因此它也可以使用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(); } }