Does Specifying @Transactional rollbackFor Also Include RuntimeException

后端 未结 3 628
感情败类
感情败类 2020-12-17 09:29
@Transactional(rollbackFor = MyCheckedException.class)
public void foo() {
    throw new RuntimeException();    
}

Will this transaction get rolled

相关标签:
3条回答
  • 2020-12-17 10:14

    So it can roll back with CheckedException as well (RuntimeException by default), example:

    @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();
        }
    }
    
    0 讨论(0)
  • 2020-12-17 10:21

    However, please note that the Spring Framework's transaction infrastructure code will, by default, only mark a transaction for rollback in the case of runtime, unchecked exceptions; that is, when the thrown exception is an instance or subclass of RuntimeException. (Errors will also - by default - result in a rollback.) Checked exceptions that are thrown from a transactional method will not result in the transaction being rolled back.

    Source

    0 讨论(0)
  • 2020-12-17 10:22

    No need to include RuntimeException in rollbackFor list. It will handle that even if you do not mention it.

    I've tried it out for 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
    
    0 讨论(0)
提交回复
热议问题