16

Java EE 6 CDI イベントはトランザクション対応ですか?

トランザクションでイベントを発生させ、その後トランザクションをロールバックすると、イベント リスナーの効果もロールバックされますか?

この動作は、トランザクションをサポートするイベント リスナー自体に依存していますか?

イベントリスナー内から例外をロールバックしようとすると、イベントを発生させたトランザクションをロールバックしますか?

4

1 に答える 1

17

CDI 1.0仕様のイベントの章から、監視しているTransactionPhaseを指定することで、イベントを「トランザクション」として定義できます。ここで、TransactionPhaseは次のいずれかです。

  • 進行中、
  • BEFORE_COMPLETION、
  • 完了後、
  • AFTER_FAILURE、
  • AFTER_SUCCESS

このような宣言は次のようになります。

void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }

オブザーバーが「トランザクション」であると宣言されていない場合、コンテナーはオブザーバーをすぐに呼び出します。それ以外の場合は、JTA同期を使用して、トランザクション完了フェーズで後で呼び出すためにオブザーバーメソッドを登録します。

でも:

トランザクションの完了前に呼び出されるオブザーバーメソッドは、 setRollbackOnly()を呼び出して、トランザクションのロールバックを強制することができます。オブザーバーメソッドは、JTAトランザクションを直接開始、コミット、またはロールバックすることはできません。

オブザーバーメソッドが例外をスローした場合(そしてそれ自体が「トランザクション」ではない場合)、例外はイベントの処理を中止します。

したがって、私が探している動作を実現するには、オブザーバーを「トランザクション」として登録し、BEFORE_COMPLETIONTransactionPhaseを指定すると思います。次に、イベントを開始したトランザクションをロールバックする場合は、setRollbackOnly()を呼び出します。

于 2010-11-21T23:32:42.303 に答える