Java EE 6 CDI イベントはトランザクション対応ですか?
トランザクションでイベントを発生させ、その後トランザクションをロールバックすると、イベント リスナーの効果もロールバックされますか?
この動作は、トランザクションをサポートするイベント リスナー自体に依存していますか?
イベントリスナー内から例外をロールバックしようとすると、イベントを発生させたトランザクションをロールバックしますか?
Java EE 6 CDI イベントはトランザクション対応ですか?
トランザクションでイベントを発生させ、その後トランザクションをロールバックすると、イベント リスナーの効果もロールバックされますか?
この動作は、トランザクションをサポートするイベント リスナー自体に依存していますか?
イベントリスナー内から例外をロールバックしようとすると、イベントを発生させたトランザクションをロールバックしますか?
CDI 1.0仕様のイベントの章から、監視しているTransactionPhaseを指定することで、イベントを「トランザクション」として定義できます。ここで、TransactionPhaseは次のいずれかです。
このような宣言は次のようになります。
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
オブザーバーが「トランザクション」であると宣言されていない場合、コンテナーはオブザーバーをすぐに呼び出します。それ以外の場合は、JTA同期を使用して、トランザクション完了フェーズで後で呼び出すためにオブザーバーメソッドを登録します。
でも:
トランザクションの完了前に呼び出されるオブザーバーメソッドは、 setRollbackOnly()を呼び出して、トランザクションのロールバックを強制することができます。オブザーバーメソッドは、JTAトランザクションを直接開始、コミット、またはロールバックすることはできません。
オブザーバーメソッドが例外をスローした場合(そしてそれ自体が「トランザクション」ではない場合)、例外はイベントの処理を中止します。
したがって、私が探している動作を実現するには、オブザーバーを「トランザクション」として登録し、BEFORE_COMPLETIONTransactionPhaseを指定すると思います。次に、イベントを開始したトランザクションをロールバックする場合は、setRollbackOnly()を呼び出します。