web-dev-qa-db-ja.com

@Transactional rollbackForを指定すると、RuntimeExceptionも含まれる

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

このトランザクションはロールバックされますか、それともアノテーションにRuntimeException.classも含める必要がありますか?

19
Alex Beardsley

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 
16
deepakraut

ただし、Spring Frameworkのトランザクションインフラストラクチャコードは、デフォルトでは、ランタイムのチェックされていない例外の場合にのみ、トランザクションにロールバックのマークを付けることに注意してください。つまり、スローされた例外がRuntimeExceptionのインスタンスまたはサブクラスである場合。 (エラーも-デフォルトで-ロールバックになります。)トランザクションメソッドからスローされたチェック済み例外では、トランザクションはロールバックされません。

ソース

8
xyz

したがって、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();
    }
}
4
Bằng Rikimaru