プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server JTAアプリケーションの開発
12c (12.2.1.1.0)
E77263-01
目次へ移動
目次

前
前へ
次
次へ

14 サード・パーティ・トランザクション・マネージャで管理されるトランザクションへの参加

この章では、WebLogic Server が、サード・パーティ・システム(外部トランザクション・マネージャと呼ばれる)が調整する分散トランザクションに参加する方法を説明します。WebLogic Serverの処理は、外部トランザクションの処理の一部として行われます。外部トランザクション・マネージャは、コミット処理の一部としてWebLogic Serverのトランザクション・マネージャを駆動します。これを、WebLogic Serverへのトランザクションの「インポート」と言います。

この章には次の項が含まれます:

外部管理トランザクションへの参加の概要

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インスタンスに実装されたサーバー側ゲートウェイの使用

実装の詳細および制限に関してはいくつかの違いがありますが、どちらの構成もトランザクションのインポートについての基本機能は同じです。

  1. WebLogic Serverのトランザクション・マネージャをルックアップし、サード・パーティ・システムでの必要に基づいて、XAResourceとして登録します。

  2. トランザクション処理時に適切なトランザクション参加者を登録および登録解除します。

  3. 準備メッセージをWebLogic Serverのトランザクション・マネージャに送信します。このトランザクション・マネージャは、従属トランザクション・マネージャとして機能し、WebLogic Server内でトランザクション参加者の準備フェーズを調整します。

  4. コミットまたはロールバック・メッセージをWebLogic Serverのトランザクション・マネージャに送信します。このトランザクション・マネージャは、従属トランザクション・マネージャとして機能し、WebLogic Server内でトランザクション参加者の2フェーズ・コミット・プロセスの第2フェーズを調整します。

  5. 必要に応じて登録解除します。

クライアント介在トランザクション・マネージャでのトランザクションのインポート

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の説明が続きます
「図14-1 クライアント側ゲートウェイを使用したWebLogic Serverへのトランザクションのインポート」の説明

図14-2に、外部トランザクション・マネージャ、WebLogic Serverのクライアント側JTAオブジェクトおよびWebLogic Serverトランザクション・マネージャの間の対話フローを示します。

図14-2 クライアント介在トランザクション・マネージャを使用したトランザクションのインポート手順を示した状態図

図14-2の説明が続きます
「図14-2 クライアント介在トランザクション・マネージャを使用したトランザクションのインポート手順を示した状態図」の説明

クライアント側ゲートウェイを使用してWebLogic Serverの介在トランザクション・マネージャにアクセスするには、次の手順を行う必要があります。

クライアント介在トランザクション・マネージャの取得

クライアント側ゲートウェイにおいて、WebLogic Server介在トランザクション・マネージャのXAResourcegetClientInterposedTransactionManagerメソッドで取得できます。例:

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呼出しが透過的に処理され、適切なクラスタ・メンバーのインスタンスに転送されます。宛先をホストするクラスタ・メンバーが失敗した場合。介在トランザクション・マネージャは分散メンバーの潜在的フェイルオーバーを透過的に処理します。

クライアント介在トランザクション・マネージャの制限

クライアント側のゲートウェイを使用してトランザクションをインポートする際は、次の制限に注意してください。

  • クライアント側のゲートウェイでは、TxHelper.getServerInterposedTransactionManager()メソッドを使用できません。

サーバー介在トランザクション・マネージャでのトランザクションのインポート

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の説明が続きます
「図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にインポートするには、外部トランザクション・マネージャまたはゲートウェイで、次の操作を行います。

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_RMERRXAExceptionがスローされます。サーバー側ゲートウェイを使用して、クライアントまたはサーバー介在トランザクション・マネージャでxar.startを呼び出そうとすると、現在のスレッドにすでにアクティブなトランザクションが関連付けられている場合、XAER_RMERRXAExceptionがスローされます。

  • 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レコードを記録します。

インポート済みトランザクションのリカバリ

外部トランザクション・マネージャのクラッシュの回復の間、外部トランザクション・マネージャは、WebLogic Server介在トランザクション・マネージャのXAResourceを再び取得し、これに対してrecoverを呼び出す必要があります。WebLogic Server介在トランザクション・マネージャは、準備されたトランザクションまたはヒューリスティックに終了したトランザクションのリストを返します。外部トランザクション・マネージャでは、準備されたトランザクションをコミットまたはロールバックするか、ヒューリスティックに終了したトランザクションに対してforgetを呼び出すかのいずれかの方法で、これらの不明なトランザクションを解決する必要があります。

トランザクション・マネージャ・システム全体のトランザクション

異なるトランザクション・マネージャ・システムにまたがるトランザクション・ブランチの密結合を構成するには、Oracle WebLogic Server管理コンソール・オンライン・ヘルプクラスタ: 構成: JTAページでEnable Tightly Coupled Transactions属性を選択します。

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アフィニティ・コンテキストは自動的にトランザクションに使用されます。