@Transactional(rollbackFor = MyCheckedException.class)
public void foo() {
throw new RuntimeException();
}
このトランザクションはロールバックされますか、それともアノテーションにRuntimeException.classも含める必要がありますか?
RuntimeException
リストにrollbackFor
を含める必要はありません。あなたがそれを言わなくてもそれはそれを扱います。
私は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 update例外 更新後 1 Deepak 35000 2 Yogesh 35000 3 Aditya 35000
ただし、Spring Frameworkのトランザクションインフラストラクチャコードは、デフォルトでは、ランタイムのチェックされていない例外の場合にのみ、トランザクションにロールバックのマークを付けることに注意してください。つまり、スローされた例外がRuntimeExceptionのインスタンスまたはサブクラスである場合。 (エラーも-デフォルトで-ロールバックになります。)トランザクションメソッドからスローされたチェック済み例外では、トランザクションはロールバックされません。
したがって、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();
}
}