指定@Transactional rollbackFor还包括RuntimeException

Ale*_*ley 18 java spring transactions exception rollback

@Transactional(rollbackFor = MyCheckedException.class)
public void foo() {
    throw new RuntimeException();    
}
Run Code Online (Sandbox Code Playgroud)

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

dee*_*aut 17

无需包括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");
}
Run Code Online (Sandbox Code Playgroud)
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


xyz*_*xyz 8

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

资源

  • 这仍然不能解释rollbackFor是添加的还是替换RuntimeException / Error的默认行为。 (5认同)

Bằn*_*aru 5

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