![]() |
![]() |
|
|
| |
この章では、 WebLogic Server アプリケーション内の WebLogic トランザクションの概要を説明します。
WebLogic Server システムの最も基本的な機能の 1 つはトランザクション管理です。トランザクションは、データベース トランザクションを正確に完了させるための手段です。また、トランザクションによって、以下のような高性能トランザクションのすべての ACID プロパティがデータベース トランザクションに備わります。
WebLogic Server はデータベースの更新が正確に行われるようにする優れたインフラストラクチャを備えているので、さまざまなリソース マネージャにまたがる場合であってもトランザクションの整合性が保護されます。1 つの処理でエラーが起きた場合は、関連するすべての処理がロールバックされます。
WebLogic Server では、Sun Microsystems の Java 2 Enterprise Edition(J2EE)プログラミング モデルのトランザクションがサポートされます。また、WebLogic Server では、エンタープライズ JavaBeans 仕様 2.0(Sun Microsystems 発行)に準拠しているエンタープライズ JavaBean を使用する Java アプリケーションのトランザクションもフルにサポートされています。さらに、WebLogic Server では、Java Transaction API(JTA)仕様 1.0.1(これも Sun Microsystems の発行)もサポートされています。
WebLogic Server では、Sun Microsystems の Java Transaction API(JTA)がサポートされています。JTA は、以下のアプリケーションで使用されます。
JTA については、以下の資料を参照してください。
WebLogic Server では、エンタープライズ アプリケーションの分散トランザクションと 2 フェーズ コミット プロトコルがサポートされます。分散トランザクションとは、複数のリソース マネージャ(データベースなど)が調和的に更新されるトランザクションのことです。一方、ローカル トランザクションは、内部的に API 呼び出しを調整する 1 つのリソース マネージャに対して、トランザクションを開始およびコミットします。このため、トランザクション マネージャはありません。2 フェーズ コミット プロトコルは、複数のリソース マネージャにまたがって 1 つのトランザクションを調整する手段です。これにより、トランザクションによる更新を関連データベースのすべてにコミットするか、またはすべてのデータベースから完全にロールバックし、トランザクションによる状態の前の状態に戻すことで、データの完全性が保証されます。つまり、関連するすべてのデータベースが更新されるか、またはどのデータベースも更新されないか、のどちらかだということです。
分散トランザクションには、以下のものが関与します。
2 フェーズ コミット プロトコルの最初のフェーズは準備フェーズと呼ばれます。要求された更新がトランザクション ログ ファイルに記録されたら、リソースはリソース マネージャを通じて変更の準備ができていることを示さなければなりません。リソースは、更新をコミットするのか、または前の状態にロールバックするのかを意思表示できます。第 2 フェーズで何が行われるかは、リソースの意思表示によって決まります。すべてのリソースがコミットを支持すると、トランザクションに関わっているすべてのリソースが更新されます。1 つまたは複数のリソースがロールバックを支持した場合は、トランザクションに関わっているすべてのリソースが前の状態にロールバックされます。
WebLogic JTA では、ビジネス トランザクションが以下のようにサポートされています。
トランザクションは、以下のような状況で使用するのが適してます。各状況は、WebLogic Server システムでサポートされているトランザクション モデルを表現してます。分散トランザクションは、ユーザ入力の複数の画面にまたがってはいけないことに注意してください。もっと複雑でハイレベルなトランザクションは、連続する分散トランザクションで実装する必要があります。
たとえば、インターネットベースのオンライン ショッピング カート アプリケーションを考えてください。クライアント アプリケーションのユーザは、オンライン カタログを参照し、複数の商品を選択します。購入するすべての商品を選択した後、ユーザは精算へと進み、クレジット カードの情報を入力します。クレジット カードの確認が失敗した場合、ショッピング アプリケーションではショッピング カートにある未処理の商品をすべてキャンセルするか、対話の中で行われた購入トランザクションをすべてロールバックすることが必要となります。
Transaction
オブジェクトおよび TransactionManager
オブジェクトの参照を取得し、トランザクションを開始することができます。
たとえば、銀行のアプリケーションを考えてください。クライアントでは、出納オブジェクトに対して送金処理を要求します。送金処理においては、出納オブジェクトは銀行のデータベースで以下の呼び出しを行わなければなりません。
トランザクションを使用しない状況
トランザクションは常に適しているわけではありません。たとえば、一連のトランザクションに時間がかかる場合は、連続する分散トランザクションで実装します。トランザクションの不適切な使用例を示します。
たとえば、旅行代理店のアプリケーションを考えてください。クライアント アプリケーションでは、たとえばフランスのストラスブールからオーストラリアのアリス スプリングスまでのような長距離の旅行を手配する必要があります。そのような長距離の旅行では、どうしても複数のフライトの予約を個別に行わなければなりません。クライアント アプリケーションでは、旅程の各区分の予約が順番に行われます。たとえば、ストラスブールからパリ、パリからニューヨーク、ニューヨークからロサンゼルスの予約が順番に行われます。ただし、いずれかのフライトの予約ができない場合、クライアント アプリケーションではそれまでに行ったフライトの予約をすべてキャンセルする必要があります。
ここでは以下について説明します。
WebLogic Server EJB アプリケーションのトランザクションの概要
図 1-1 は、WebLogic Server EJB アプリケーションでトランザクションがどのように機能するのかを示しています。
図1-1 WebLogic Server EJB アプリケーションでのトランザクションの仕組み
WebLogic Server では、WebLogic Server EJB アプリケーションで以下の 2 種類のトランザクションがサポートされています。
UserTransaction
オブジェクトに対する明示的なメソッド呼び出しを行って、トランザクションの開始、コミット、およびロールバックを行います。UserTransaction
オブジェクトの詳細については、WebLogic の Javadoc を参照してください。
トランザクション イベントのシーケンスは、コンテナ管理のトランザクションと Bean 管理のトランザクションで異なります。
トランザクションがコンテナで管理される EJB アプリケーションの場合、基本的なトランザクションは次のように機能します。
transaction-type
要素)としてコンテナ管理の境界設定(Container
)を指定します。
trans-attribute
要素)を指定します。トランザクション属性としては、NotSupported
、Required
、Supports
、RequiresNew
、Mandatory
、または Never
を設定します。これらの設定の詳細については、Sun Microsystems が発行している EJB 仕様 2.0 のセクション 16.7.2 を参照してください。
trans-attribute
を指定します。
trans-attribute
設定を調べます。メソッドの設定が指定されていない場合は、その EJB のデフォルトの trans-attribute
設定が使用されます。
trans-attribute
の設定に応じて適切に動作します。
trans-attribute
の設定が Required
の場合、EJB コンテナは既存のトランザクション コンテキストでメソッドを呼び出します。クライアントがトランザクション コンテキストなしで呼び出しを行った場合、EJB コンテナはメソッドを実行する前に新しいトランザクションを開始します。
trans-attribute
の設定が Mandatory
の場合、EJB コンテナは既存のトランザクション コンテキストでメソッドを呼び出します。クライアントがトランザクション コンテキストなしで呼び出しを行った場合、EJB コンテナは javax.transaction.TransactionRequiredException
例外を送出します。
EJBContext.setRollbackOnly
メソッドが呼び出されます。このメソッドでは、メソッド呼び出しの終了時にトランザクションをロールバックしなければならないことが EJB コンテナに通知されます。
注意: EJBContext.setRollbackOnly
メソッドの呼び出しは、意味のあるトランザクション コンテキストを持つメソッドの場合だけ許可されます。
EJBContext.setRollbackOnly
メソッドが呼び出された場合です。
Administration Console を使用して trans-timeout-seconds
要素を設定すれば、トランザクションのタイムアウトを指定できます。
トランザクションの境界設定が Bean で管理される EJB アプリケーションの場合、基本的なトランザクションは次のように機能します。
transaction-type
要素)として Bean 管理の境界設定(Bean
)を指定します。
UserTransaction
オブジェクトへのオブジェクト参照を取得します。
UserTransaction.begin
メソッドを使用してトランザクションを開始し、EJB コンテナを通じて EJB への要求を発行します。EJB でのすべての処理は、トランザクションのスコープ内で実行されます。
UserTransaction.rollback
メソッドを使用してトランザクションをロールバックすることができます。
UserTransaction.commit
メソッドを使用して現在のトランザクションをコミットします。このメソッドは、トランザクションを終了して処理を開始します。トランザクションは、そのトランザクションに関わっているすべてのリソースがコミットに同意した場合だけコミットされます。
UserTransaction.commit
メソッドが呼び出されると、EJB コンテナはトランザクションを完了するためにトランザクション マネージャを呼び出します。
WebLogic Server RMI アプリケーションのトランザクションの概要
図 1-2 は、WebLogic Server RMI アプリケーションでトランザクションがどのように機能するのかを示しています。
図1-2 WebLogic Server RMI アプリケーションでのトランザクションの仕組み
RMI のクライアント アプリケーションとサーバ アプリケーションの場合、基本的なトランザクションは次のように機能します。
UserTransaction
オブジェクトへのオブジェクト参照を返します。
オブジェクト参照を取得すると、アプリケーションとそのオブジェクトが対話状態に入ります。対話状態は、コミットかロールバックによってトランザクションが完了するまで続きます。インスタンス化された RMI オブジェクトは、解放されるまで(たいていはサーバの停止時)メモリ内でアクティブな状態を維持します。トランザクションの間は、WebLogic Server インフラストラクチャによって非アクティベーションやアクティベーションは実行されません。
UserTransaction.begin
メソッドを使用してトランザクションを開始し、サーバ アプリケーションへの要求を発行します。サーバ アプリケーションでのすべての処理は、トランザクションのスコープ内で実行されます。
UserTransaction.rollback
メソッドを使用してトランザクションをロールバックすることができます。
UserTransaction.commit
メソッドを使用して現在のトランザクションをコミットします。このメソッドは、トランザクションを終了して処理を開始します。トランザクションは、そのトランザクションに関わっているすべてのリソースがコミットに同意した場合だけコミットされます。
UserTransaction.commit
メソッドが呼び出されると、WebLogic Server はトランザクションを完了するためにトランザクション マネージャを呼び出します。
詳細については、 RMI アプリケーションのトランザクションを参照してください。
ここでは以下について説明します。
この節では、EJB アプリケーションのクラスから抜粋したサンプル コードを利用して段階的な説明を行います。ここでは以下について説明します。
サンプル コードでは、Bean 管理によるトランザクションの境界設定で UserTransaction
オブジェクトが使用されます。この Bean のデプロイメント記述子では、トランザクションの種類(transaction-type
要素)として Bean 管理によるトランザクションの境界設定(Bean
)が指定されます。
注意: 以下のサンプル コードは、WebLogic Server に付属するサンプル アプリケーションから抜粋したものではありません。単に、EJB アプリケーションでの UserTransaction
オブジェクトの利用を説明するために用意されたものです。
グローバル トランザクションでは、EJB が動作している WebLogic Server インスタンス上のローカルな TxDataSource からのデータベース接続を使用します。リモート WebLogic Server インスタンス上の TxDataSource からの接続は使用しないでください。
コード リスト 1-1 は、トランザクションで必要なパッケージのインポートを示しています。必要なパッケージには以下のものがあります。
javax.transaction.UserTransaction
。このオブジェクトに関連付けられているメソッドのリストについては、オンラインの Javadoc を参照してください。
コード リスト 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.*;
これらのクラスがインポートされた後に、UserTransaction
オブジェクトのインスタンスが null に初期化されます。
コード リスト 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)
tx.begin();
ctx.lookup("javax.transaction.UserTransaction");
コード リスト 1-4 は、このトランザクションのスコープ内で試行されたいずれかのデータベース処理で例外が送出されたかどうかに依存するトランザクションの完了を示しています。
javax.transaction.UserTransaction.rollback()
メソッドが呼び出されます。
javax.transaction.UserTransaction.commit()
メソッドが呼び出され、すべてのデータベース処理が正常に終了した後にトランザクションのコミットが試行されます。このメソッドが呼び出されると、トランザクションが終了し、処理が開始されて、WebLogic Server EJB コンテナによってトランザクションを完了するためにトランザクション マネージャが呼び出されます。トランザクションは、そのトランザクションに関わっているすべてのリソースがコミットに同意した場合だけコミットされます。
コード リスト 1-4 トランザクションの完了
tx.commit();
// または
tx.rollback();
この節では、RMI アプリケーションのクラスから抜粋したサンプル コードを利用して段階的な説明を行います。ここでは以下について説明します。
サンプル コードでは、RMI トランザクションで UserTransaction
オブジェクトが使用されます。RMI アプリケーションでのトランザクションの使用のガイドラインについては、
RMI アプリケーションのトランザクションを参照してください。
注意: 以下のサンプル コードは、WebLogic Server に付属するサンプル アプリケーションから抜粋したものではありません。単に、RMI アプリケーションでの UserTransaction
オブジェクトの利用を説明するために用意されたものです。
コード リスト 1-5 は、必要なパッケージのインポートを示しています。必要なパッケージには、トランザクションの処理に使用する以下のパッケージが含まれます。
javax.transaction.UserTransaction
。このオブジェクトに関連付けられているメソッドのリストについては、オンラインの Javadoc を参照してください。
コード リスト 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)
tx.begin();
ctx.lookup("javax.transaction.UserTransaction");
コード リスト 1-8 は、このトランザクションのスコープ内で試行されたいずれかのデータベース処理で例外が送出されたかどうかに依存するトランザクションの完了を示しています。
javax.transaction.UserTransaction.rollback()
メソッドが呼び出されます。
javax.transaction.UserTransaction.commit()
メソッドが呼び出され、すべてのデータベース処理が正常に終了した後にトランザクションのコミットが試行されます。このメソッドが呼び出されると、トランザクションが終了し、処理が開始されて、WebLogic Server によってトランザクションを完了するためにトランザクション マネージャが呼び出されます。トランザクションは、そのトランザクションに関わっているすべてのリソースがコミットに同意した場合だけコミットされます。
コード リスト 1-8 トランザクションの完了
tx.commit();
// または
tx.rollback();
![]() |
![]() |
![]() |