BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

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

 Previous Next Contents Index PDF で侮ヲ  

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

この章では次の内容について説明します。

 


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

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

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

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

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

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

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

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

図1-1 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 のセクション 16.7.2 を参照してください。

  3. 必要に応じて、Bean プロバイダまたはアプリケーション アセンブラは、EJB のデプロイメント記述子で、1 つまたは複数のメソッドの trans-attribute を指定します。

  4. クライアント アプリケーションによって EJB のメソッドが呼び出されると、EJB コンテナはデプロイメント記述子でそのメソッドの trans-attribute 設定を調べます。メソッドの設定が指定されていない場合は、その EJB のデフォルトの trans-attribute 設定が使用されます。

  5. EJB コンテナは、trans-attribute の設定に応じて適切に動作します。

  6. ビジネス メソッドの呼び出しの途中で、ロールバックが必要だと判断された場合、ビジネス メソッドでは EJBContext.setRollbackOnly メソッドが呼び出されます。このメソッドでは、メソッド呼び出しの終了時にトランザクションをロールバックしなければならないことが EJB コンテナに通知されます。

    注意: EJBContext.setRollbackOnly メソッドの呼び出しは、意味のあるトランザクション コンテキストを持つメソッドの場合だけ許可されます。

  7. メソッドの実行が終了して、その結果がクライアントに送信される前に、EJB コンテナはコミットするかまたはロールバックすることによってトランザクションを完了します。トランザクションがロールバックされるのは、EJBContext.setRollbackOnly メソッドが呼び出された場合です。

Administration Console を使用して Timeout Seconds 属性を設定すれば、トランザクションのタイムアウトを指定できます。Administration Console オンライン ヘルプを参照してください。

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

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

  1. Bean プロバイダまたはアプリケーション アセンブラは、EJB のデプロイメント記述子で、トランザクションの種類 (transaction-type 要素) として Bean 管理の境界設定 (Bean) を指定します。

  2. クライアント アプリケーションは、JNDI を使用して、WebLogic Server ドメインの UserTransaction オブジェクトへのオブジェクト参照を取得します。

  3. クライアント アプリケーションは、UserTransaction.begin メソッドを使用してトランザクションを開始し、EJB コンテナを通じて EJB への要求を発行します。EJB でのすべての処理は、トランザクションのスコープ内で実行されます。

  4. UserTransaction.commit メソッドが呼び出されると、EJB コンテナはトランザクションを完了するためにトランザクション マネージャを呼び出します。

  5. トランザクション マネージャの役割は、リソース マネージャと協力してデータベースを更新することです。

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

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

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


 

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

  1. アプリケーションは、JNDI を使用して、WebLogic Server ドメインの UserTransaction オブジェクトへのオブジェクト参照を返します。

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

  2. クライアント アプリケーションは、UserTransaction.begin メソッドを使用してトランザクションを開始し、サーバ アプリケーションへの要求を発行します。サーバ アプリケーションでのすべての処理は、トランザクションのスコープ内で実行されます。

  3. UserTransaction.commit メソッドが呼び出されると、WebLogic Server はトランザクションを完了するためにトランザクション マネージャを呼び出します。

  4. トランザクション マネージャの役割は、リソース マネージャと協力してデータベースを更新することです。

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

 


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

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

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

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

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

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

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

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

コード リスト 1-1 パッケージのインポート

import javax.naming.*;
import javax.transaction.UserTransaction;
import javax.transaction.SystemException;
import javax.transaction.HeuristicMixedException
import javax.transaction.HeuristicRollbackException
import javax.transaction.NotSupportedException
import javax.transaction.RollbackException
import javax.transaction.IllegalStateException
import javax.transaction.SecurityException
import java.sql.*;
import java.util.*;

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

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

コード リスト 1-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");

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

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

コード リスト 1-3 トランザクションの開始

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

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

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

コード リスト 1-4 トランザクションの完了

tx.commit();

// または

tx.rollback();

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

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

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

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

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

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

コード リスト 1-5 パッケージのインポート

import javax.naming.*;
import java.rmi.*;
import javax.transaction.UserTransaction;
import javax.transaction.SystemException;
import javax.transaction.HeuristicMixedException
import javax.transaction.HeuristicRollbackException
import javax.transaction.NotSupportedException
import javax.transaction.RollbackException
import javax.transaction.IllegalStateException
import javax.transaction.SecurityException
import java.sql.*;
import java.util.*;

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

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

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

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

コード リスト 1-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");

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

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

コード リスト 1-7 トランザクションの開始

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

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

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

コード リスト 1-8 トランザクションの完了

tx.commit();

// または

tx.rollback();

 

Back to Top Previous Next