14 サード・パーティ・トランザクション・マネージャで管理されるトランザクションへの参加
外部管理トランザクションへの参加の概要
WebLogic Serverのトランザクション・マネージャは、weblogic.transaction.InterposedTransactionManager
インタフェースを通じて、javax.transaction.xa.XAResource
実装を公開します。外部トランザクション・マネージャは、InterposedTransactionManager
インタフェースにアクセスして、コミット処理時にWebLogic Serverトランザクション・マネージャのXAResource
を調整できます。
外部トランザクション・マネージャからトランザクションをWebLogic Serverのトランザクション・マネージャにインポートする場合には、外部トランザクション・マネージャに従属マネージャとして、WebLogic Server介在トランザクション・マネージャ(ITM)を登録する必要があります。その結果、WebLogic Serverのトランザクション・マネージャは、インポートされたトランザクションの調整役としてWebLogic Server内で機能します。
WebLogic Serverでは、トランザクションのインポートに関して、次の2つの構成方式がサポートされています。
-
クライアント介在トランザクション・マネージャを使用する、WebLogic Serverに外部的に実装されたクライアント側ゲートウェイの使用
-
サーバー介在トランザクション・マネージャを使用する、WebLogic Serverインスタンスに実装されたサーバー側ゲートウェイの使用
実装の詳細および制限に関してはいくつかの違いがありますが、どちらの構成もトランザクションのインポートについての基本機能は同じです。
-
WebLogic Serverのトランザクション・マネージャをルックアップし、サード・パーティ・システムでの必要に基づいて、XAResourceとして登録します。
-
トランザクション処理時に適切なトランザクション参加者を登録および登録解除します。
-
準備メッセージをWebLogic Serverのトランザクション・マネージャに送信します。このトランザクション・マネージャは、従属トランザクション・マネージャとして機能し、WebLogic Server内でトランザクション参加者の準備フェーズを調整します。
-
コミットまたはロールバック・メッセージをWebLogic Serverのトランザクション・マネージャに送信します。このトランザクション・マネージャは、従属トランザクション・マネージャとして機能し、WebLogic Server内でトランザクション参加者の2フェーズ・コミット・プロセスの第2フェーズを調整します。
-
必要に応じて登録解除します。
クライアント介在トランザクション・マネージャでのトランザクションのインポート
WebLogic Serverでクライアント介在トランザクション・マネージャを使用して、サード・パーティのトランザクション・マネージャが調整するトランザクションに対して2フェーズ・コミット・プロセスを駆動し、WebLogic Server内にJMSリソースやJDBCリソースなどのトランザクション参加者を含めることができます。クライアント介在トランザクション・マネージャは、javax.transaction.xa.XAResource
インタフェースの実装です。
クライアント介在トランザクション・マネージャには、サード・パーティ・アプリケーションから直接アクセスします。通常は、サード・パーティ・アプリケーションのゲートウェイからアクセスします。サード・パーティ・システムのトランザクション・マネージャは、準備メッセージおよびコミット・メッセージをゲートウェイに送信し、ゲートウェイがそのメッセージをWebLogic Serverトランザクション・マネージャに伝播します。そして、WebLogic Serverのトランザクション・マネージャが従属トランザクション・マネージャとして機能し、WebLogic Server内でトランザクション参加者を調整します。図14-1に、2つのトランザクション・マネージャとクライアント側ゲートウェイとの間の対話を示します。
図14-1 クライアント側ゲートウェイを使用したWebLogic Serverへのトランザクションのインポート
「図14-1 クライアント側ゲートウェイを使用したWebLogic Serverへのトランザクションのインポート」の説明
図14-2に、外部トランザクション・マネージャ、WebLogic Serverのクライアント側JTAオブジェクトおよびWebLogic Serverトランザクション・マネージャの間の対話フローを示します。
図14-2 クライアント介在トランザクション・マネージャを使用したトランザクションのインポート・ステップを示した状態図
「図14-2 クライアント介在トランザクション・マネージャを使用したトランザクションのインポート・ステップを示した状態図」の説明
クライアント側ゲートウェイを使用してWebLogic Serverの介在トランザクション・マネージャにアクセスするには、次のステップを行う必要があります。
クライアント介在トランザクション・マネージャの取得
クライアント側ゲートウェイにおいて、WebLogic Server介在トランザクション・マネージャのXAResource
をgetClientInterposedTransactionManager
メソッドで取得できます。たとえば:
import javax.naming.Context; import weblogic.transaction.InterposedTransactionManager; import weblogic.transaction.TxHelper; Context initialCtx; String serverName; InterposedTransactionManager itm = TxHelper.getClientInterposedTransactionManager(initialCtx, serverName);
サーバー名パラメータは、外部トランザクションに対して介在トランザクション・マネージャとして機能するサーバーの名前です。外部トランザクション・マネージャはクラッシュのリカバリ処理を行う際に、同じWebLogic Serverのサーバーに接続して、WebLogic Serverにインポート済の不明なトランザクションのリストを取得する必要があります。
Oracle WebLogic Server Java APIリファレンスのweblogic.transaction.TxHelper
を参照してください。
介在トランザクション・マネージャからのXAResourceの取得
介在トランザクション・マネージャを取得したら、その介在トランザクション・マネージャに関連付けられたXAResourceオブジェクトを取得する必要があります。
import javax.transaction.xa.XAResource; XAResource xar = itm.getXAResource();
クラスタ全体の回復
クラスタのすべての介在トランザクション・マネージャに渡り分散トランザクションのクラスタ全体でトランザクションを回復するよう構成するには、Oracle WebLogic Server管理コンソール・オンライン・ヘルプのクラスタ: 構成: JTAページでEnable Cluster-Wide Recovery
属性を選択します。
WebLogicクラスタ内の各介在トランザクション・マネージャが有効になっている場合、クラスタ全体にわたるトランザクションの分散が認識されます。これにより、各クラスタ・メンバー上の介在トランザクション・マネージャでは特定のXA呼出しを処理する必要があるか、または別のクラスタ・メンバーの適切な介在トランザクション・マネージャに転送する必要があるかが判断されます。さらに、次のように処理されます。
-
WebLogicクラスタ内の単一のITM上の
XAResource.recover
呼出しは、そのクラスタ内のすべての介在トランザクション・マネージャのうちのインダウト・トランザクションのリストを返します。 -
クラスタ・メンバーが失敗した場合、介在トランザクション・マネージャは同じクラスタ内の別のクラスタ・メンバーに移行されます。
-
WebLogic分散宛先がクラスタ上に存在する場合、メッセージは介在トランザクション・マネージャをホストするメンバーではなく、他のクラスタ・メンバーへロード・バランスされる可能性があります。このようになると、介在トランザクション・マネージャでは任意のXA呼出しが透過的に処理され、適切なクラスタ・メンバーのインスタンスに転送されます。宛先をホストするクラスタ・メンバーが失敗した場合。介在トランザクション・マネージャは分散メンバーの潜在的フェイルオーバーを透過的に処理します。
サーバー介在トランザクション・マネージャでのトランザクションのインポート
WebLogic Serverでサーバー介在トランザクション・マネージャを使用して、サード・パーティのトランザクション・マネージャが調整するトランザクションに対して2フェーズ・コミット・プロセスを駆動し、WebLogic Server内にJMSリソースやJDBCリソースなどのトランザクション参加者を含めることができます。サーバー介在トランザクション・マネージャは、javax.transaction.xa.XAResource
インタフェースの実装です。
WebLogic Serverにサーバー側のゲートウェイを作成して、サード・パーティ・システムからそのゲートウェイにアクセスして、サーバー介在トランザクション・マネージャにアクセスします。サード・パーティ・システムのトランザクション・マネージャから、準備メッセージおよびコミット・メッセージがサーバー側ゲートウェイに送信されます。それらのメッセージは、そのゲートウェイからWebLogic Serverトランザクション・マネージャに伝播します。そして、WebLogic Serverのトランザクション・マネージャが従属トランザクション・マネージャとして機能し、WebLogic Server内でトランザクション参加者を調整します。図14-3は、2つのトランザクション・マネージャとサーバー側ゲートウェイの間の対話を示したものです。
図14-3 サーバー側ゲートウェイを使用したWebLogic Serverへのトランザクションのインポート
「図14-3 サーバー側ゲートウェイを使用したWebLogic Serverへのトランザクションのインポート」の説明
サーバー側ゲートウェイを使用してWebLogic Serverの介在トランザクション・マネージャにアクセスするには、次のステップを行う必要があります。
サーバー介在トランザクション・マネージャの取得
サーバー側ゲートウェイにおいて、介在トランザクション・マネージャのXAResourceを次のようにして取得できます。
import javax.naming.Context; import weblogic.transaction.InterposedTransactionManager; import weblogic.transaction.TxHelper; InterposedTransactionManager itm = TxHelper.getServerInterposedTransactionManager();
Oracle WebLogic Server Java APIリファレンスのweblogic.transaction.TxHelper
を参照してください。
介在トランザクション・マネージャの取得後に、XAResource
を取得する必要があります。「介在トランザクション・マネージャからのXAResourceの取得」を参照してください。
サーバー介在トランザクション・マネージャの制限
サーバー側のゲートウェイを使用してトランザクションをインポートする際は、次の制限に注意してください。
-
WebLogic Serverサーバーのサーバー側ゲートウェイでは、
TxHelper.getClientInterposedTransactionManager()
メソッドを使用しません。このメソッドを使用すると、パフォーマンスの問題が発生します。 -
一度に使用できるWebLogic Serverサーバー介在トランザクション・マネージャは1つのみです。一度に2つ以上のサーバー介在トランザクション・マネージャ(同じスレッドにある)を、トランザクションのインポートに使用しないでください。(この制限の詳細、およびWebLogic Server介在トランザクション・マネージャでのトランザクション処理の詳細については、「インポート済みトランザクションのトランザクション処理」を参照してください。)
インポート済みトランザクションのトランザクション処理
外部トランザクション・マネージャまたはゲートウェイを使用して、外部トランザクションをWebLogic Serverにインポートできます。
外部トランザクションをWebLogic Serverにインポートするには、外部トランザクション・マネージャまたはゲートウェイで、次の操作を行います。
xar.start(foreignXid, TMNOFLAGS);
この操作によって、現在のスレッドとインポート済トランザクションが関連付けられます。トランザクションとスレッドの関連付けが解除されるまで、他のサーバーに対する以降のすべての呼出しで、インポート済WebLogic Serverトランザクションが伝播されます。
ノート:
WebLogic Serverトランザクション・マネージャでは、フラグが無視されます。外部Xidが同じWebLogic Serverサーバーにインポート済の場合、WebLogic Serverは現在のスレッドをインポート済のWebLogic Serverトランザクションに関連付けます。
インポート済みのトランザクションと現在のスレッドの関連付けを解除するには、外部トランザクション・マネージャまたはゲートウェイで次の操作を行う必要があります。
xar.end(foreignXid, TMSUCCESS);
WebLogic Serverのトランザクション・マネージャがフラグを無視することに注意してください。
インポート済みトランザクションのトランザクション処理の制限
インポート済みのトランザクションに関して、次の処理の制限と動作に注意してください。
-
WebLogic Serverトランザクションが開始されたら、ゲートウェイでは同じスレッド上でstartを再び呼び出すことができません。クライアント側ゲートウェイで、1つのクライアント介在トランザクション・マネージャで一度に呼び出すことができるのは、
xar.start
のみです。別のクライアント介在トランザクション・マネージャで(最初のトランザクション・マネージャでxar.end
を呼び出す前に)、xar.start
を呼び出そうとすると、XAER_RMERR
のXAException
がスローされます。サーバー側ゲートウェイを使用して、クライアントまたはサーバー介在トランザクション・マネージャでxar.start
を呼び出そうとすると、現在のスレッドにすでにアクティブなトランザクションが関連付けられている場合、XAER_RMERR
のXAException
がスローされます。 -
WebLogic Server介在トランザクション・マネージャの
XAResource
は、異なるWebLogic Serverサーバー上で、疎結合のトランザクションのブランチ化動作を示します。つまり、同じ外部Xidが異なるWebLogic Serverサーバーにおいてインポートされると、異なるWebLogic Serverトランザクションにインポートされます。 -
WebLogic Serverのトランザクション・マネージャは、トランザクション・ツリーをフラット化しません。たとえば、前にエクスポートしたWebLogic Serverトランザクションのインポート済トランザクションは、元のWebLogic Serverトランザクションとは別のブランチに配置されます。
-
外部トランザクション・マネージャでは、WebLogic Serverにインポートされるすべての外部Xidが一意で、トランザクション破棄タイムアウト期間およびトランザクションのタイムアウト期間の合計値内で再利用されていないことを確認する必要があります。これができないと、ログ・レコードがWebLogic Serverトランザクション・マネージャで解放されなくなることがあります。その結果、クラッシュのリカバリが効率的に行われないおそれがあります。
インポート済みトランザクションのコミット処理
外部トランザクション・マネージャが、インポートされたトランザクションのコミット処理の介在トランザクション・マネージャを準備する方法を学習します。
外部トランザクション・マネージャは、他のXAResource
を駆動するように、2PCプロトコルにおいて介在トランザクション・マネージャを駆動する必要があります。WebLogic Server JTA (EJBコンテナなど)に登録されたbeforeCompletion
コールバックは、外部トランザクション・マネージャが介在トランザクション・マネージャのXAResource
を準備する際に呼び出されることに注意してください。afterCompletion
コールバックは、XAResource.commit
またはXAResource.rollback
の間に呼び出されます。
WebLogic Server介在トランザクション・マネージャは、http://www.oracle.com/technetwork/java/javaee/jta/index.html
のJava Transaction APIに記載されているXAResource
規約に準拠しています。
-
WebLogic Server介在トランザクション・マネージャは、外部トランザクション・マネージャによって準備されると、トランザクション破棄タイムアウトが経過するまで、外部トランザクション・マネージャからのコミットまたはロールバックを永続的に待機します。
-
WebLogic Server介在トランザクション・マネージャは、外部トランザクション・マネージャからトランザクションを無視するように指示されるか、トランザクション破棄タイムアウトが経過するまで、ヒューリスティックな出力を永続的に記憶します。
WebLogic Serverトランザクション・マネージャは、WebLogic Serverのすべての参加者の準備が正常に行われると、インポート済のトランザクションについて、prepare
レコードを記録します。インポート済のトランザクションについてWebLogic Serverの参加者が2つ以上ある場合、トランザクション・マネージャはXAResource.commit
が1フェーズ・コミットでもprepareレコードを記録します。
インポート済みトランザクションのリカバリ
XAResource
を再び取得し、これに対してrecoverを呼び出す必要があります。 WebLogic Server介在トランザクション・マネージャは、準備されたトランザクションまたはヒューリスティックに終了したトランザクションのリストを返します。外部トランザクション・マネージャでは、準備されたトランザクションをコミットまたはロールバックするか、ヒューリスティックに終了したトランザクションに対してforgetを呼び出すかのいずれかの方法で、これらの不明なトランザクションを解決する必要があります。
トランザクション・マネージャ・システム全体のトランザクション
異なるトランザクション・マネージャ・システムにまたがるトランザクション・ブランチの密結合を構成するには、Oracle WebLogic Server管理コンソール・オンライン・ヘルプのCluster:Configuration:JTA
ページでEnable Tightly Coupled Transactions
属性を選択します。
属性Enable Tightly Coupled Transactions
については、Oracle WebLogic Server Administration Consoleオンライン・ヘルプのCluster: Configuration: JTAページを参照してください。
Enable Tightly Coupled Transactions
属性が有効になっている場合、WebLogic Serverは、内部でトランザクションIDをマッピングするのではなく、XA呼出しに対して介在トランザクション・マネージャによってインポートされたトランザクションのトランザクション識別子を使用します。このようにトランザクション・マネージャをより緊密に結合することで、通常は、パフォーマンスが向上します。この密結合は、ドメイン間のWebLogicトランザクション、およびTuxedoからインポートされたトランザクションに適用されます。
ノート:
-
Oracleでは、WSATを使用した相互運用性が有効な外部トランザクション処理システムを使用した密結合トランザクションをサポートしていません。ただし、同一トランザクションIDを使用する単一クラスタ内のEJBおよびアプリケーションでは、密結合トランザクションが有効です。WSATの詳細は、『Oracle WebLogic Server JAX-WS Webサービスの開発』の「Webサービス原子性トランザクションの使用」を参照してください。
WebLogicリソースとTuxedoリソースの間のトランザクションで、GridLinkアフィニティが有効なGridLinkデータ・ソースが使用される場合、XAアフィニティ・コンテキストは自動的にトランザクションに使用されます。