Jakarta EE APIの 1 つであるJakarta Transactions ( JTA、旧称Java Transaction API ) を使用すると、 Java環境内の複数のX/Open XAリソース間で分散トランザクションを実行できます。JTA は、 Java Community Processの下でJSR 907 として 開発された仕様です。JTAは次の機能を提供します。
- 取引境界の画定[明確化が必要]
- リソースがトランザクションに参加できるようにするX/Open XA API。
X/Open XA アーキテクチャ
X/Open XA アーキテクチャでは、トランザクション マネージャーまたはトランザクション処理モニター(TP モニター) が、データベースやメッセージ キューなどの複数のリソース間でトランザクションを調整します。各リソースには独自のリソース マネージャーがあります。リソース マネージャーには通常、リレーショナル データベースを操作するためのJDBC API など、リソースを操作するための独自の API があります。さらに、リソース マネージャーにより、TP モニターは自身のリソース マネージャーと他のリソース マネージャー間の分散トランザクションを調整できます。最後に、TP モニターと通信してトランザクションを開始、コミット、またはロールバックするアプリケーションがあります。アプリケーションは、独自の API を使用して個々のリソースと通信し、リソースを変更します。
X/Open XA アーキテクチャの JTA 実装
JTA API は、次の 2 つのJava パッケージ内のクラスで構成されています。
javax.transactionjavax.transaction.xa
JTA は X/Open XA アーキテクチャをモデルにしていますが、トランザクション境界を定める 2 つの異なる API を定義しています。EJBサーバーなどのアプリケーション サーバーとアプリケーション コンポーネントを区別します。アプリケーション サーバー自体がトランザクションを開始、コミット、およびロールバックするために使用するインターフェイス を提供します。また、サーブレットやEJBなどの一般的なクライアント コードがトランザクションを管理するために使用する
javax.transaction.TransactionManager別のインターフェイス も提供します。javax.transaction.UserTransaction
JTA アーキテクチャでは、各リソース マネージャーが TP モニターによって管理されるようにインターフェイスを実装する必要がありますjavax.transaction.xa.XAResource。前述のように、各リソースには独自の特定の API があります。たとえば、次のようになります。
- リレーショナルデータベースはJDBCを使用する
- メッセージングサービスはJMSを使用する
- 一般化された EIS (エンタープライズ情報システム) リソース[説明が必要]は、 Java EE コネクタ APIを使用します。
翻訳
Jakarta Transactions API は、高レベルのアプリケーション トランザクション境界インターフェイス、アプリケーション サーバー向けの高レベルのトランザクション マネージャー インターフェイス、およびトランザクション リソース マネージャー向けの X/Open XA プロトコルの標準 Java マッピングという 3 つの要素で構成されています。
UserTransaction インターフェース
このjavax.transaction.UserTransactionインターフェースは、アプリケーションにトランザクション境界をプログラムで制御する機能を提供します。このインターフェースは、Java クライアント プログラムまたは EJB Bean によって使用される場合があります。
このUserTransaction.begin()メソッドは、グローバル トランザクションを開始し、トランザクションを呼び出しスレッドに関連付けます。トランザクションとスレッドの関連付けは、トランザクション マネージャーによって透過的に管理されます。
ネストされたトランザクションのサポートは必須ではありません。呼び出しスレッドがすでにトランザクションに関連付けられており、トランザクション マネージャーの実装がネストされたトランザクションをサポートしていない場合、UserTransaction.begin メソッドは NotSupportedException をスローします。
アプリケーション プログラム間のトランザクション コンテキストの伝播は、クライアント マシンとサーバー マシン上の基礎となるトランザクション マネージャ実装によって提供されます。伝播に使用されるトランザクション コンテキスト形式はプロトコルに依存し、クライアント ホストとサーバー ホスト間でネゴシエートする必要があります。たとえば、トランザクション マネージャがJTS仕様の実装である場合、CORBA OTS 1.1 仕様で指定されているトランザクション コンテキスト伝播形式が使用されます。トランザクション伝播は、アプリケーション プログラムに対して透過的です。
@トランザクションアノテーション
このjavax.transaction.Transactionalアノテーションは、アプリケーションにトランザクション境界を宣言的に制御する機能を提供します。このアノテーションは、Jakarta EE 仕様でマネージド Bean (CDI マネージド Bean を含む) として定義されている任意のクラスに適用できます。
以下のコード サンプルは、@Transactionalリクエスト スコープの CDI マネージド Bean での使用法を示しています。
@RequestScoped
パブリッククラスExampleBean {
@Transactional
public void foo () { // ここでトランザクションがアクティブです// 作業を実行します
} // メソッドが返された後、トランザクションはコミットまたはロールバックされます}
トランザクションの動作は、アノテーションの属性を介して構成できます。使用可能なオプションは、EJB仕様のオプションとほぼ同じです。
@TransactionScoped アノテーション
このjavax.transaction.TransactionScopedアノテーションにより、Bean の存続範囲が特定のトランザクションがアクティブな時間に関連付けられていることをアプリケーションが宣言できるようになります。
以下のコード サンプルは、@TransactionScopedリクエスト スコープの CDI マネージド Bean での使用法を示しています。
@TransactionScoped
パブリッククラスTxScopedBean { public int数値;
public int getNumber () { return number ;} public void setNumber ( int number ) { this . number = number ;} }
@RequestScoped
パブリッククラスExampleBean {
@Inject
プライベートTxScopedBean txScopedBean ;
@Transactional
パブリックvoid foo () { txScopedBean . setNumber ( 1 ); }
@Transactional
public void bar ( ) { System.out.print ( tXscopedBean.getNumber ( ) ) ; } }
メソッドfoo()が最初に ExampleBean の管理対象インスタンスで呼び出され、その後メソッドbar()が呼び出された場合、出力される数値は 1 ではなく 0 になります。これは、各メソッドに独自のトランザクションがあり、したがって独自の TxScopedBean インスタンスがあるためです。したがって、 foo()の呼び出し中に設定された数値 1 は、bar()の呼び出し中には表示されません。
EJB サーバーでの UserTransaction サポート
EJBUserTransactionサーバーは、アノテーションに BEAN 値を持つ EJB Bean が使用するインターフェースをサポートする必要がありますjavax.ejb.TransactionManagement(これは、Bean 管理トランザクションまたは BMT と呼ばれます)。インターフェースは、メソッドを使用するインターフェース
UserTransaction
を介して、または一般的なアノテーションを使用した注入を介して直接、EJB コンポーネントに公開されます。したがって、EJB アプリケーションは、トランザクションの境界設定のためにトランザクション マネージャと直接インターフェースしません。代わりに、EJB Bean は、Jakarta Enterprise Beans 仕様で定義されているすべてのトランザクション作業のサポートを EJB サーバーに依存します。(EJB サーバーと TM 間の基盤となる対話は、アプリケーションに対して透過的です。トランザクション管理を実装する負担は、EJB コンテナとサーバー プロバイダーにあります。[1] )
EJBContextgetUserTransaction@Resource
以下のコード サンプルは、UserTransactionEJB セッション Bean での Bean 管理トランザクションの使用方法を示しています。
@Stateless
@TransactionManagement ( BEAN )
パブリッククラスExampleBean {
@Resource
プライベートUserTransaction utx ;
public void foo () { // トランザクションを開始するutx .begin ( ) ;
// 作業を行う
//コミットするutx.commit () ; } }
あるいは、UserTransactionは から取得することもできますSessionContext。
@Stateless
@TransactionManagement ( BEAN )
パブリッククラスExampleBean {
@Resource
プライベートSessionContext ctx ;
パブリックvoid foo () { UserTransaction utx = ctx . getUserTransaction ();
// トランザクションを開始します
utx.begin ( ) ;
// 作業を行う
//コミットするutx.commit () ; } }
ただし、上記の例では、@TransactionManagement(BEAN)アノテーションが省略されている場合、 が呼び出されるたびに JTA トランザクションが自動的に開始されfoo()、 が終了すると自動的にコミットまたはロールバックされることに注意してくださいfoo()。 を使用することはUserTransaction、EJB プログラミングでは必要ありませんが、非常に特殊なコードでは必要になる場合があります。
JNDI での UserTransaction サポート
UserTransaction は、java:comp/UserTransaction(JTA 実装が環境にインストールされている場合) で使用可能になります。
参照
参考文献
- ^ JSR 220: Enterprise JavaBeans、バージョン 3.0、EJB 3.0 Expert Group、Sun Microsystems、2006 [永久リンク切れ ]
外部リンク
- 公式サイト
- JSR907
- Atomikos トランザクション マネージャーの Web サイト
- ナラヤナ取引マネージャーのウェブサイト
- Bitronix トランザクション マネージャーの Web サイト
