ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JTA プログラマーズ ガイド
11g リリース 1 (10.3.1)
B55540-01
 

目次
目次

戻る
戻る
 
次へ
次へ
 

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

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 介在トランザクション マネージャを登録する必要があります。その結果、WebLogic Server のトランザクション マネージャは、インポートされたトランザクションの調整役として WebLogic Server 内で機能します。

WebLogic Server では、トランザクションのインポートに関して、次の 2 つのコンフィグレーション方式がサポートされています。

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

  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 内でトランザクション参加者を調整します。図 12-1 は、2 つのトランザクション マネージャとクライアントサイド ゲートウェイの間の対話を示したものです。

図 12-1 クライアントサイド ゲートウェイを使用した WebLogic Server へのトランザクションのインポート

図 12-1 の説明については以下を参照
「図 12-1 クライアントサイド ゲートウェイを使用した WebLogic Server へのトランザクションのインポート」の説明

図 12-2 は、外部トランザクション マネージャ、WebLogic Server クライアントサイド JTA オブジェクト、および WebLogic Server トランザクション マネージャの間の対話フローを示したものです。

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

図 12-2 の説明については以下を参照
「図 12-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);

serverName パラメータは、外部トランザクションに対して介在トランザクション マネージャとして機能するサーバの名前です。外部トランザクション マネージャはクラッシュの回復処理を行う際に、同じ WebLogic Server のサーバに接続して、WebLogic Server にインポート済みの不明なトランザクションのリストを取得する必要があります。

詳細については、『Oracle Fusion Middleware Oracle WebLogic Server API Reference』の「weblogic.transaction.TxHelper」を参照してください。

介在トランザクション マネージャからの XAResource の取得

介在トランザクション マネージャを取得したら、その介在トランザクション マネージャに関連付けられた XAResource オブジェクトを取得する必要があります。

import javax.transaction.xa.XAResource;
XAResource xar = itm.getXAResource();

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

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

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

  • 一度に使用できる WebLogic Server クライアント介在トランザクション マネージャは 1 つのみ。一度に 2 つ以上のクライアント介在トランザクション マネージャ (異なる WebLogic Server サーバに接続している) を、トランザクションのインポートに使用しないでください (この制限の詳細、および WebLogic Server 介在トランザクション マネージャでのトランザクション処理の詳細については、「インポート済みトランザクションのトランザクション処理」を参照)。

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

WebLogic Server でサーバ介在トランザクション マネージャを使用して、サード パーティのトランザクション マネージャが調整するトランザクションに対して 2 フェーズ コミット プロセスを駆動し、WebLogic Server 内に JMS リソースや JDBC リソースなどのトランザクション参加者を含めることができます。サーバ介在トランザクション マネージャは、javax.transaction.xa.XAResource インタフェースの実装です。WebLogic Server にサーバサイドのゲートウェイを作成して、サード パーティ システムからそのゲートウェイにアクセスして、サーバ介在トランザクション マネージャにアクセスします。サード パーティ システムのトランザクション マネージャから、準備メッセージおよびコミット メッセージがサーバサイド ゲートウェイに送信されます。それらのメッセージは、そのゲートウェイから WebLogic Server トランザクション マネージャに伝播します。そして、WebLogic Server のトランザクション マネージャが従属トランザクション マネージャとして機能することで、WebLogic Server 内でトランザクション参加者の調整が行われます。図 12-3 は、2 つのトランザクション マネージャとサーバサイド ゲートウェイの間の対話を示したものです。

図 12-3 サーバサイド ゲートウェイを使用した WebLogic Server へのトランザクションのインポート

図 12-3 の説明については以下を参照
「図 12-3 サーバサイド ゲートウェイを使用した WebLogic Server へのトランザクションのインポート」の説明

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

サーバ介在トランザクション マネージャの取得

サーバサイド ゲートウェイにおいて、介在トランザクション マネージャの XAResource を次のようにして取得できます。

import javax.naming.Context;
import weblogic.transaction.InterposedTransactionManager;
import weblogic.transaction.TxHelper;
InterposedTransactionManager itm = TxHelper.getServerInterposedTransactionManager();

詳細については、『Oracle Fusion Middleware Oracle WebLogic Server API Reference』の「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://java.sun.com/products/jta/index.html の「Java Transaction API」に記載されている XAResource 規約に準拠しています。

WebLogic Server トランザクション マネージャは、WebLogic Server のすべての参加者の準備が正常に行われると、インポート済みのトランザクションについて、prepare レコードを記録します。インポート済みのトランザクションについて WebLogic Server の参加者が 2 つ以上ある場合、トランザクション マネージャは XAResource.commit が 1 フェーズ コミットでも prepare レコードを記録します。

インポート済みトランザクションの回復

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