このUserTransaction
オブジェクトは、コンテナが内部的に使用する API 呼び出しへのアクセスをラップするコンテナによって提供されるオブジェクトであり、具体的にはjavax.transaction.TransactionManager です。、、などのTransactionManager
メソッドがあります。begin
commit
rollback
javax.transaction.Transaction getTransaction()
内部では、TransactionManager はThreadLocalまたは同様の手法を使用して、スレッドで現在のトランザクション状態を追跡します。static HashMap
ThreadLocals は、スレッド名をキーとして使用し、選択したオブジェクトを値として使用する非常に単純なオブジェクトです。同じスレッドにいる限り、呼び出しチェーンの任意のポイントからオブジェクトを取得できます。これが、Java EE 環境でスレッドを開始できない理由の 1 つです。
java:comp/env
セキュリティ伝播は、適切なモジュールまたはコンポーネントの名前空間を魔法のように指す JNDI ルックアップと同様に機能します。つまり、ThreadLocals なしではアプリ サーバーを実装できないということです。伝播は実際よりもアクティブに聞こえますが、実際には、スレッドを離れないという行為であるため、コンテナと関係者全員が「もの」を見つけることができます。
トランザクション管理の用語に戻ると、TransactionManager がその ThreadLocal で追跡するオブジェクトは、通常、TransactionおよびTransactionSynchronizationRegistryインターフェースの両方を (直接的または間接的に) 実装します。これら 2 つのインターフェースの間に、コンテナーには、ユーザーに代わって現在のトランザクションで 、 、およびその他のリソースDataSource
を追跡するために必要なすべてのフックがあります。EntityManager
これらのインターフェースにより、コンテナーはSessionSynchronizationなどのコールバックを提供したり、EntityManager のフラッシュ/クローズ、JMS 保留メッセージの送信、コースでアプリによって作成されたタイマーの永続化など、トランザクションの完了時にユーザーに代わって他のことを行う手段を提供したりできます。トランザクションの。