Does Specifying @Transactional rollbackFor Also In

2019-01-25 06:33发布

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

Will this transaction get rolled back, or do I need to include RuntimeException.class in the annotation as well?

3条回答
\"骚年 ilove
2楼-- · 2019-01-25 06:47

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
查看更多
ゆ 、 Hurt°
3楼-- · 2019-01-25 06:49

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

查看更多
叼着烟拽天下
4楼-- · 2019-01-25 07:03

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();
    }
}
查看更多
登录 后发表回答