Does Specifying @Transactional rollbackFor Also Include RuntimeException
Solution 1
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
Solution 2
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.
Solution 3
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();
}
}
Related videos on Youtube
Alex Beardsley
Updated on November 05, 2020Comments
-
Alex Beardsley over 3 years
@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?
-
deepakraut over 11 years@AlexBeardsley thnx for pointing out the mistake... i modified the answer.. I re-ran the code.. and yes, you need not include runtime exception in rollbackFor list.
-
Bằng Rikimaru about 6 years@AkshayKasar If I didn't try, I wouldn't have posted.
-
Mauro Molinari over 5 yearsThis still does not explain whether rollbackFor is additive or replacing the default behaviour on RuntimeException/Error.
-
rougou about 5 yearsFrom my experience, when you do this people start copying your code without understanding how it works, and then it becomes difficult to review their code as you don't know their real intentions regarding rollback/exception handling. So I prefer only to list checked exceptions in the
rollbackFor
. In most cases this will be the same as what is in yourthrows
declaration, so it isn't very difficult to maintain. By the same token, I would avoidthrows Exception
in most cases, as it will be impossible to judge which checked exceptions are actually thrown.