WebLogic JTA プログラマーズ ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

トランザクションについて

この節では、以下のトピックを取り上げます。

 


WebLogic Server アプリケーションのトランザクションの概要

この節の内容は以下のとおりです。

トランザクションの ACID プロパティ

WebLogic Server の最も基本的な機能の 1 つはトランザクション管理です。トランザクションは、データベースの変更を正確に完了させるための手段です。また、トランザクションによって、以下のような高性能トランザクションのすべての ACID プロパティがデータベース トランザクションに備わります。

WebLogic Server はデータベースの更新が正確に行われるようにする優れたインフラストラクチャを備えているので、さまざまなリソース マネージャにまたがる場合であってもトランザクションの整合性が保護されます。1 つの処理でエラーが起きた場合は、関連するすべての処理がロールバックされます。

サポートされているプログラミング モデル

WebLogic Server では、Sun Microsystems の Java™ 2 Platform Enterprise Edition (J2EE) プログラミング モデルのトランザクションがサポートされています。また、WebLogic Server では、エンタープライズ JavaBeans 仕様 2.1 (Sun Microsystems 発行) に準拠しているエンタープライズ JavaBean を使用する Java アプリケーションのトランザクションも完全にサポートされています。さらに、Java Transaction API (JTA) 仕様 1.0.1B (これも Sun Microsystems の発行) もサポートされています。

サポートされている API モデル

WebLogic Server では、Sun Microsystems の Java Transaction API (JTA) がサポートされています。JTA は、以下のアプリケーションで使用されます。

JTA については、以下の資料を参照してください。

分散トランザクションと 2 フェーズ コミット プロトコル

WebLogic Server では、エンタープライズ アプリケーションの分散トランザクションと 2 フェーズ コミット プロトコルがサポートされます。分散トランザクションとは、複数のリソース マネージャ (データベースなど) が調和的に更新されるトランザクションのことです。一方、ローカル トランザクションは、内部的に API 呼び出しを調整する 1 つのリソース マネージャに対して、トランザクションを開始およびコミットします。このため、トランザクション マネージャはありません。2 フェーズ コミット プロトコルは、複数のリソース マネージャにまたがって 1 つのトランザクションを調整する手段です。これにより、トランザクションによる更新を関連するデータベースのすべてでコミットするか、またはすべてのデータベースから完全にロールバックし、トランザクション開始前の状態に戻すことで、データの完全性が保証されます。つまり、関連するすべてのデータベースが更新されるか、またはどのデータベースも更新されないか、のどちらかだということです。

分散トランザクションには、以下のものが関与します。

2 フェーズ コミット プロトコルの最初のフェーズは準備フェーズと呼ばれます。要求された更新がトランザクション ログ ファイルに記録されたら、リソースはリソース マネージャを通じて変更の準備ができていることを示さなければなりません。リソースは、更新をコミットするのか、または前の状態にロールバックするのかを意思表示できます。第 2 フェーズで何が行われるかは、リソースの意思表示によって決まります。すべてのリソースがコミットを支持すると、トランザクションに関わっているすべてのリソースが更新されます。1 つまたは複数のリソースがロールバックを支持した場合は、トランザクションに関わっているすべてのリソースが前の状態にロールバックされます。

ビジネス トランザクションのサポート

WebLogic JTA では、ビジネス トランザクションが以下のようにサポートされています。

 


どのような状況で使用するのか

トランザクションは、以下のような状況で使用するのが適しています。各状況は、WebLogic Server システムでサポートされているトランザクション モデルを表現しています。分散トランザクションは、ユーザ入力の複数の画面にまたがってはいけないことに注意してください。もっと複雑でハイレベルなトランザクションは、連続する分散トランザクションで実装する必要があります。

 


トランザクションの仕組み

ここでは以下について説明します。

WebLogic Server EJB アプリケーションのトランザクション

図 2-1 は、WebLogic Server EJB アプリケーションでトランザクションがどのように機能するのかを示しています。

図 2-1 WebLogic Server EJB アプリケーションでのトランザクションの仕組み

WebLogic Server EJB アプリケーションでのトランザクションの仕組み

WebLogic Server では、WebLogic Server EJB アプリケーションで以下の 2 種類のトランザクションがサポートされています。

トランザクション イベントのシーケンスは、コンテナ管理のトランザクションと Bean 管理のトランザクションで異なります。

コンテナ管理のトランザクション

トランザクションがコンテナで管理される EJB アプリケーションの場合、基本的なトランザクションは次のように機能します。

  1. Bean プロバイダまたはアプリケーション アセンブラは、EJB のデプロイメント記述子で、トランザクションの種類 (transaction-type) としてコンテナ管理の境界設定 (Container) を指定します。
  2. Bean プロバイダまたはアプリケーション アセンブラは、EJB のデプロイメント記述子で、EJB のデフォルトのトランザクション属性 (trans-attribute 要素) を指定します。トランザクション属性としては、NotSupportedRequiredSupportsRequiresNewMandatory、または Never を設定します。これらの設定の詳細については、Sun Microsystems が発行している EJB 仕様 2.0 のセクション 17.6.2 を参照してください。
  3. 必要に応じて、Bean プロバイダまたはアプリケーション アセンブラは、EJB のデプロイメント記述子で、1 つまたは複数のメソッドの trans-attribute を指定します。
  4. クライアント アプリケーションによって EJB のメソッドが呼び出されると、EJB コンテナはデプロイメント記述子でそのメソッドの trans-attribute 設定を調べます。メソッドの設定が指定されていない場合は、その EJB のデフォルトの trans-attribute 設定が使用されます。
  5. EJB コンテナは、trans-attribute の設定に応じて適切に動作します。
    • たとえば、trans-attribute の設定が Required の場合、EJB コンテナは既存のトランザクション コンテキストでメソッドを呼び出します。クライアントがトランザクション コンテキストなしで呼び出しを行った場合、EJB コンテナはメソッドを実行する前に新しいトランザクションを開始します。
    • trans-attribute の設定が Mandatory の場合、EJB コンテナは既存のトランザクション コンテキストでメソッドを呼び出します。クライアントがトランザクション コンテキストなしで呼び出しを行った場合、EJB コンテナは javax.transaction.TransactionRequiredException 例外を送出します。
  6. ビジネス メソッドの呼び出しの途中で、ロールバックが必要だと判断された場合、ビジネス メソッドでは EJBContext.setRollbackOnly メソッドが呼び出されます。このメソッドでは、メソッド呼び出しの終了時にトランザクションをロールバックしなければならないことが EJB コンテナに通知されます。
  7. 注意 : EJBContext.setRollbackOnly メソッドの呼び出しは、意味のあるトランザクション コンテキストを持つメソッドの場合だけ許可されます。
  8. メソッドの実行が終了して、その結果がクライアントに送信される前に、EJB コンテナはコミットするかまたはロールバックすることによってトランザクションを完了します。トランザクションがロールバックされるのは、EJBContext.setRollbackOnly メソッドが呼び出された場合です。

Bean 管理のトランザクション

トランザクションの境界設定が Bean で管理される EJB アプリケーションの場合、基本的なトランザクションは次のように機能します。

  1. Bean プロバイダまたはアプリケーション アセンブラは、EJB のデプロイメント記述子で、トランザクションの種類 (transaction-type 要素) として Bean 管理の境界設定 (Bean) を指定します。
  2. クライアント アプリケーションは、JNDI を使用して、WebLogic Server ドメインの UserTransaction オブジェクトに対するオブジェクト参照を取得します。
  3. クライアント アプリケーションは、UserTransaction.begin メソッドを使用してトランザクションを開始し、EJB コンテナを通じて EJB への要求を発行します。EJB でのすべての処理は、トランザクションのスコープ内で実行されます。
    • いずれかの処理の呼び出しで例外が (明示的に、または通信エラーの結果として) 生成された場合は、その例外を捕捉し、UserTransaction.rollback メソッドを使用してトランザクションをロールバックできます。
    • 例外が生成されない場合、クライアント アプリケーションは UserTransaction.commit メソッドを使用して現在のトランザクションをコミットします。このメソッドは、トランザクションを終了して処理を開始します。トランザクションは、そのトランザクションに関わっているすべてのリソースがコミットに同意した場合だけコミットされます。
  4. UserTransaction.commit メソッドが呼び出されると、EJB コンテナはトランザクションを完了するためにトランザクション マネージャを呼び出します。
  5. トランザクション マネージャの役割は、リソース マネージャと協力してデータベースを更新することです。

WebLogic Server RMI アプリケーションのトランザクション

図 2-2 は、WebLogic Server RMI アプリケーションでトランザクションがどのように機能するのかを示しています。

図 2-2 WebLogic Server RMI アプリケーションでのトランザクションの仕組み

WebLogic Server RMI アプリケーションでのトランザクションの仕組み

RMI のクライアント アプリケーションとサーバ アプリケーションの場合、基本的なトランザクションは次のように機能します。

  1. アプリケーションは、JNDI を使用して、WebLogic Server ドメインの UserTransaction オブジェクトに対するオブジェクト参照を返します。
  2. オブジェクト参照を取得すると、アプリケーションとそのオブジェクトが対話状態に入ります。対話状態は、コミットかロールバックによってトランザクションが完了するまで続きます。インスタンス化された RMI オブジェクトは、解放されるまで (たいていはサーバの停止時) メモリ内でアクティブな状態を維持します。トランザクションの間は、WebLogic Server インフラストラクチャによって非アクティベーションやアクティベーションは実行されません。

  3. クライアント アプリケーションは、UserTransaction.begin メソッドを使用してトランザクションを開始し、サーバ アプリケーションへの要求を発行します。サーバ アプリケーションでのすべての処理は、トランザクションのスコープ内で実行されます。
    • いずれかの処理の呼び出しで例外が (明示的に、または通信エラーの結果として) 生成された場合は、その例外を捕捉し、UserTransaction.rollback メソッドを使用してトランザクションをロールバックできます。
    • 例外が生成されない場合、クライアント アプリケーションは UserTransaction.commit メソッドを使用して現在のトランザクションをコミットします。このメソッドは、トランザクションを終了して処理を開始します。トランザクションは、そのトランザクションに関わっているすべてのリソースがコミットに同意した場合だけコミットされます。
  4. UserTransaction.commit メソッドが呼び出されると、WebLogic Server はトランザクションを完了するためにトランザクション マネージャを呼び出します。
  5. トランザクション マネージャの役割は、リソース マネージャと協力してデータベースを更新することです。

詳細については、「RMI アプリケーションのトランザクション」を参照してください。

 


トランザクションのサンプル コード

この節の内容は以下のとおりです。

トランザクションのサンプル EJB コード

この節では、EJB アプリケーションのクラスから抜粋したサンプル コードを利用して段階的な説明を行います。ここでは以下について説明します。

サンプル コードでは、Bean 管理によるトランザクションの境界設定で UserTransaction オブジェクトが使用されます。この Bean のデプロイメント記述子では、トランザクションの種類 (transaction-type 要素) として Bean 管理によるトランザクションの境界設定 (Bean) が指定されます。

注意 : グローバル トランザクションでは、EJB が実行されている WebLogic Server インスタンス上の、ローカル JDBC データ ソースからデータベース接続を使用します。リモート WebLogic Server インスタンス上の JDBC データ ソースからは接続を使用しないでください。
注意 : 以下のサンプル コードは、WebLogic Server に付属するサンプル アプリケーションから抜粋したものではありません。単に、EJB アプリケーションでの UserTransaction オブジェクトの利用を説明するために用意されたものです。

パッケージをインポートする

コード リスト 2-1 は、トランザクションで必要なパッケージのインポートを示しています。必要なパッケージには以下のものがあります。

JNDI を使用してオブジェクト参照を返す

コード リスト 2-2 は、JNDI ツリーでオブジェクトをルックアップする方法を示します。

コード リスト 2-2 JNDI のルックアップの実行
Context ctx = null;
Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");

// WebLogic Server のパラメータ
// 環境に合わせて適切なホスト名、ポート番号、
// ユーザ名、およびパスワードに置き換える
env.put(Context.PROVIDER_URL, "t3://localhost:7001");
env.put(Context.SECURITY_PRINCIPAL, "Fred");
env.put(Context.SECURITY_CREDENTIALS, "secret");

ctx = new InitialContext(env);

UserTransaction tx = (UserTransaction)
ctx.lookup("javax.transaction.UserTransaction");

トランザクションを開始する

コード リスト 2-3 は、UserTransaction オブジェクトを取得し、javax.transaction.UserTransaction.begin() メソッドを呼び出すことによるトランザクションの開始を示しています。このメソッド呼び出しの後、トランザクションが完了するまでに行われるデータベースの処理は、このトランザクションのスコープ内に存在します。

コード リスト 2-3 トランザクションの開始
UserTransaction tx = (UserTransaction)
ctx.lookup("javax.transaction.UserTransaction");
tx.begin();

トランザクションを完了する

コード リスト 2-4 は、このトランザクションのスコープ内で試行されたいずれかのデータベース処理で例外が送出されたかどうかに依存する、トランザクションの完了を示しています。

トランザクションのサンプル RMI コード

この節では、RMI アプリケーションのクラスから抜粋したサンプル コードを利用して段階的な説明を行います。ここでは以下について説明します。

サンプル コードでは、RMI トランザクションで UserTransaction オブジェクトが使用されます。RMI アプリケーションでのトランザクションの使用のガイドラインについては、「RMI アプリケーションのトランザクション」を参照してください。

注意 : 以下のサンプル コードは、WebLogic Server に付属するサンプル アプリケーションから抜粋したものではありません。単に、RMI アプリケーションでの UserTransaction オブジェクトの利用を説明するために用意されたものです。

パッケージをインポートする

コード リスト 2-5 は、必要なパッケージのインポートを示しています。必要なパッケージには、トランザクションの処理に使用する以下のパッケージが含まれます。

これらのクラスがインポートされた後に、UserTransaction オブジェクトのインスタンスが null に初期化されます。

JNDI を使用して UserTransaction オブジェクトへのオブジェクト参照を返す

コード リスト 2-6 は、適切な WebLogic Server ドメインの UserTransaction オブジェクトに対するオブジェクト参照を返すための JNDI ツリーの検索を示しています。

注意 : オブジェクト参照を取得すると、アプリケーションとそのオブジェクトが対話状態に入ります。対話状態は、コミットかロールバックによってトランザクションが完了するまで続きます。インスタンス化された RMI オブジェクトは、解放されるまで (たいていはサーバの停止時) メモリ内でアクティブな状態を維持します。トランザクションの間は、WebLogic Server インフラストラクチャによって非アクティベーションやアクティベーションは実行されません。
コード リスト 2-6 JNDI のルックアップの実行
Context ctx = null;
Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");

// WebLogic Server のパラメータ
// 環境に合わせて適切なホスト名、ポート番号、
// ユーザ名、およびパスワードに置き換える
env.put(Context.PROVIDER_URL, "t3://localhost:7001");
env.put(Context.SECURITY_PRINCIPAL, "Fred");
env.put(Context.SECURITY_CREDENTIALS, "secret");

ctx = new InitialContext(env);

UserTransaction tx = (UserTransaction)
ctx.lookup("javax.transaction.UserTransaction");

トランザクションを開始する

コード リスト 2-7 は、javax.transaction.UserTransaction.begin() メソッドを呼び出すことによるトランザクションの開始を示しています。このメソッド呼び出しの後、トランザクションが完了するまでに行われるデータベースの処理は、このトランザクションのスコープ内に存在します。

コード リスト 2-7 トランザクションの開始
UserTransaction tx = (UserTransaction)
ctx.lookup("javax.transaction.UserTransaction");
tx.begin();

トランザクションを完了する

コード リスト 2-8 は、このトランザクションのスコープ内で試行されたいずれかのデータベース処理で例外が送出されたかどうかに依存する、トランザクションの完了を示しています。


  ページの先頭       前  次