EJBに@Asynchronous
メソッドがあり、@TransactionAttribute
を指定しない場合、コンテナーはトランザクション境界をどの程度正確に処理しますか?明らかに、呼び出し元のスレッドのトランザクションを使用できないので、それは何をしますか?
同じ質問ですが、TimerServiceによってトリガーされるメソッドに関するものです。
編集:私はそれをうまく表現しなかったと思います。デフォルトのモードが「必須」であることはすでに知っています。したがって、これらのメソッドは常にトランザクション内で呼び出されると想定しても安全です。しかし、私の質問は、そのトランザクションのライフサイクルはどのように見えるかということです。コンテナは呼び出しごとに新しいトランザクションを作成しますか?または、非同期ワーカースレッドでのすべての呼び出しに同じトランザクションを再利用しますか?後者の場合、トランザクションはいつ終了しますか?
MDBと同様に、トランザクションは、_@Asynchronous
_、_@Schedule
_、または_@Timeout
_メソッド(および該当するインターセプター)が実際に呼び出され、メソッド(およびインターセプター)の直後にコミットされる直前にコンテナーによって開始されます。完了します。
通常どおり、トランザクションは、上記のメソッドで呼び出されたすべてのBeanと、それらのBeanが呼び出すすべてのBeanに再帰的に伝播します。もちろん、呼び出された他のBeanは、他の_@TransactionAttribute
_設定(たとえば、_REQUIRES_NEW
_または_NOT_SUPPORTED
_)を指定することにより、メソッド呼び出しのトランザクションセマンティクスを変更できます。
ちなみに、トランザクションは@TransactionManagement(BEAN)
を使用してBeanに伝播されることはありません。コンテナは常に Bean-Managed Transaction Beanでメソッドを呼び出す前に、進行中のトランザクションを一時停止します。
EJB3.1仕様から。
4.5.3トランザクション
クライアントトランザクションコンテキストは、非同期メソッド呼び出しでは伝播されません。 Bean開発者の観点からは、クライアントからトランザクションコンテキストが流入することはありません。これは、たとえば、非同期メソッドのREQUIREDトランザクション属性のセマンティクスがREQUIRES_NEWとまったく同じであることを意味します。