質問

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

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

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

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

役に立ちましたか?

解決

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

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

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

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

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

しかし:

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top