CDI管理ビーンに付けるだけでトランザクション処理してくれる@Transactionalアノテーションについてです。

JSR-907のドキュメントから拾い読みしてみました。

@Transactionalって何よ?

CDIのインターセプターです。CDIのインターセプターはAOP的なことをしてくれるやつです。

メソッドにつけると、そのメソッドの呼び出しに介入し、呼び出し前後にチョメチョメしたりなんだりできます。

@Transactionalのオプション

@Transactionalアノテーションで指定できるオプションについてです。

オプションは2つあります。

  • トランザクション内外で呼ばれた時の振る舞いを指定
  • 例外発生時の振る舞いを指定

トランザクション内外で呼ばれたときの振る舞い

トランザクション内外で、CDI管理ビーンのメソッドが呼ばれたときの振る舞いを設定できます。

TxType トランザクション外から 既存トランザクション内から 備考
TxType.REQUIRED 新しいトランザクションを開始 既存トランザクション内で実行 既定値
TxType.REQUIRED_NEW 新しいトランザクションを開始 既存トランザクションを一旦停止して新しいトランザクション内で実行  
TxType.MANDATORY TransactionRequiredExceptionをネストしたTransactionalExceptionをスロー 既存トランザクション内で実行  
TxType.SUPPORTS そのままトランザクション外で実行 既存トランザクション内で実行  
TxType.NOT_SUPPORTED そのままトランザクション外で実行 既存トランザクションを一旦停止して、トランザクション外で実行  
TxType.NEVER そのままトランザクション外で実行 InvalidTRansactionExceptionをネストしたTransactionalExceptionをスロー  

例外発生時の振る舞い

既定では、チェック例外発生時にはロールバックしません。RuntimeExceptionを継承した例外ではロールバックします。

rollbackOn

ロールバックしたい例外を指定します。

以下の例は、あらゆるアプリケーション例外発生時にトランザクションをロールバックするようにマークします。


@Transactional(rollbackOn={Exception.class})

dontRollbackOn

ロールバックさせたくない例外を指定します。rollbackOndontRollbackOn両方を指定したときは、dontRollbackOnが優先します。

以下の例は、IllegalStateExceptionやこれを継承した例外発生時に、トランザクションをロールバックするマークを付けないようにします。


@Transactional(dontRollbackOn={IllegalStateException.class})