ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JTAのプログラミング
11g リリース1(10.3.4)
B61631-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

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リファレンスの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リファレンスの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/javaee/technologies/jta/index.jspの「Java Transaction API」に記載されているXAResource規約に準拠しています。

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

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

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