16

Bean 管理のトランザクションを使用するステートレス Bean と、次のようなメソッドがあります。

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class ... {

    @Resource 
    private UserTransaction ut;
    @EJB 
    private OtherStatelessBeanLocal other;

    public void invokeSomeMethods() 
        ut.begin();
        ...

        // invoke other bean's methods here.
        other.method();

        ...
        ut.commit();

    }

}

では、どのようにしてBeanにUserTransaction伝播するのでしょうか?OtherStatelessBeanLocal

4

3 に答える 3

32

このUserTransactionオブジェクトは、コンテナが内部的に使用する API 呼び出しへのアクセスをラップするコンテナによって提供されるオブジェクトであり、具体的にはjavax.transaction.TransactionManager です。、、などのTransactionManagerメソッドがあります。begincommitrollbackjavax.transaction.Transaction getTransaction()

内部では、TransactionManager はThreadLocalまたは同様の手法を使用して、スレッドで現在のトランザクション状態を追跡します。static HashMapThreadLocals は、スレッド名をキーとして使用し、選択したオブジェクトを値として使用する非常に単純なオブジェクトです。同じスレッドにいる限り、呼び出しチェーンの任意のポイントからオブジェクトを取得できます。これが、Java EE 環境でスレッドを開始できない理由の 1 つです。

java:comp/envセキュリティ伝播は、適切なモジュールまたはコンポーネントの名前空間を魔法のように指す JNDI ルックアップと同様に機能します。つまり、ThreadLocals なしではアプリ サーバーを実装できないということです。伝播は実際よりもアクティブに聞こえますが、実際には、スレッドを離れないという行為であるため、コンテナと関係者全員が「もの」を見つけることができます。

トランザクション管理の用語に戻ると、TransactionManager がその ThreadLocal で追跡するオブジェクトは、通常、TransactionおよびTransactionSynchronizationRegistryインターフェースの両方を (直接的または間接的に) 実装します。これら 2 つのインターフェースの間に、コンテナーには、ユーザーに代わって現在のトランザクションで 、 、およびその他のリソースDataSourceを追跡するために必要なすべてのフックがあります。EntityManagerこれらのインターフェースにより、コンテナーはSessionSynchronizationなどのコールバックを提供したり、EntityManager のフラッシュ/クローズ、JMS 保留メッセージの送信、コースでアプリによって作成されたタイマーの永続化など、トランザクションの完了時にユーザーに代わって他のことを行う手段を提供したりできます。トランザクションの。

于 2010-11-09T21:57:35.977 に答える
4

EJB 仕様に基づいて、プログラムによるトランザクションを使用して Bean (この場合はメイン クラス ... ) から別の Bean (この場合はその他) にプログラムによるトランザクションを使用してトランザクション コンテキストを渡すことはできません。

于 2011-01-08T04:57:54.257 に答える
0

EJB3 の場合、通常は @TransactionAttribute アノテーションを使用してトランザクションの伝播を定義します。

すべての EJB 3.0 アプリケーションのデフォルトのトランザクション属性は必須です。

クライアントがトランザクション コンテキストに関連付けられているときにエンタープライズ Bean のメソッドを呼び出すと、コンテナはクライアントのトランザクション コンテキストでエンタープライズ Bean のメソッドを呼び出します。

トランザクション タイプのドキュメントは次のとおりです: http://download.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html

注意: 永続コンテキストとトランザクションの伝播は通常一緒に発生しますが、常に発生するとは限りません - 注意してください。たとえば、ステートフル セッション Bean には、拡張された持続性コンテキストがある場合があります。

于 2010-11-09T22:10:41.753 に答える