36
  1. @AsynchronousEJBにメソッドがあり、を指定しない場合、@TransactionAttributeコンテナーはトランザクション境界をどの程度正確に処理しますか?明らかに、呼び出し元のスレッドのトランザクションを使用できないので、それは何をしますか?

  2. 同じ質問ですが、TimerServiceによってトリガーされるメソッドに関するものです。


編集:私はそれをうまく表現できなかったと思います。デフォルトのモードが「必須」であることはすでに知っています。したがって、これらのメソッドは常にトランザクション内で呼び出されると想定するのが安全です。しかし、私の質問は、そのトランザクションのライフサイクルはどのように見えるかということです。コンテナは呼び出しごとに新しいトランザクションを作成しますか?または、非同期ワーカースレッドでのすべての呼び出しに同じトランザクションを再利用しますか?後者の場合、トランザクションはいつ終了しますか?

4

2 に答える 2

46

@AsynchronousMDB と同様に、メソッド (@Scheduleおよび@Timeout適用可能なインターセプター) が実際に呼び出され、メソッド (およびインターセプター) が完了した直後にコミットされる直前に、コンテナーによってトランザクションが開始されます。

通常どおり、トランザクションは、上記のメソッドで呼び出されたすべての Bean と、それらの Bean が呼び出すすべての Bean に再帰的に伝播します。もちろん、呼び出された他の Bean は、他の@TransactionAttribute設定 ( REQUIRES_NEW、または などNOT_SUPPORTED) を指定して、メソッド呼び出しのトランザクション セマンティクスを変更できます。

補足として、トランザクションは Bean に伝播されることはありません@TransactionManagement(BEAN)。コンテナーは、Bean 管理のトランザクション Bean でメソッドを呼び出す前に、進行中のトランザクションを常に中断します。

編集:

編集された質問により直接的に答える; Java Transaction API を介して 1 つのトランザクションを複数のスレッドにまたがらせる手段がないため、EJB には手段がありません。すべて@Asynchronousの呼び出しは、呼び出し元のトランザクション (存在する場合) から完全に切断されます。基本的に、使用した内容に応じて、新しいトランザクションが発生するか、トランザクションが発生しないか、または例外が発生し@TransactionAttributeます。からのコールと同じTimerServiceです。

于 2010-10-27T01:06:52.103 に答える