WebLogic JTA プログラマーズ ガイド
![]() |
![]() |
![]() |
![]() |
この章では、BEA WebLogic Server 上で動作するエンタープライズ JavaBean (EJB) アプリケーションでトランザクションを実装する方法を説明します。
本題に入る前に、「トランザクションについて」の特に以下の節を読んでおく必要があります。
ここでは、エンタープライズ JavaBean でのトランザクションの BEA WebLogic Server 実装について説明します。ここで説明する情報は、Sun Microsystems 発行の EJB 仕様 2.0 を補足するものです。
注意 : この章を読み進める前に、EJB 仕様 2.0 のドキュメントの内容、特に第 16 章「Support for Transactions」で提示されている概念やデータをよく理解しておく必要があります。
エンタープライズ JavaBean の詳細については、『WebLogic エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』を参照してください。
以下のガイドラインは、WebLogic Server 向けの EJB アプリケーションでトランザクションを実装するときに適用されます。
WebLogic Server トランザクション サービスのガイドラインについては、「機能と制限」を参照してください。
トランザクション属性では、トランザクションが EJB アプリケーションでどのように管理されるのかが指定されます。各 EJB について、トランザクション属性により、トランザクションの境界が WebLogic Server EJB コンテナによって設定されるのか (コンテナ管理のトランザクション)、または EJB 自体によって設定されるのか (Bean 管理のトランザクション) が指定されます。EJB がコンテナ管理と Bean 管理のどちらであるのかは、デプロイメント記述子の transaction-type
要素の設定で決まります。transaction-type
要素の詳細については、EJB 仕様 2.0 の第 16 章「Support for Transactions」と第 21 章「Deployment Descriptor」を参照してください。
概して、Bean 管理のトランザクションよりもコンテナ管理のトランザクションの方がよく使用されます。なぜなら、その方がアプリケーションのコードがシンプルになるからです。たとえば、コンテナ管理のトランザクションでは、トランザクションを明示的に開始する必要がありません。
WebLogic Server では、EJB 仕様 2.0 のセクション 16.4 で定義されているメソッド レベルのトランザクション属性が完全にサポートされています。
コンテナ管理のトランザクションの場合、トランザクション属性はデプロイメント記述子の container-transaction
要素で指定します。コンテナ管理のトランザクションには、すべてのエンティティ Bean と、transaction-type
が Container
に設定されているステートフルまたはステートレスのセッション Bean が含まれます。詳細については、『WebLogic エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』を参照してください。
EJB とそのビジネス メソッドで指定できるトランザクション属性は以下のとおりです。
trans-attribute
設定で WebLogic Server EJB コンテナがどのように機能するのかについては、EJB 仕様 2.0 のセクション 17.6.2 を参照してください。
デプロイメント記述子でタイムアウト値が定義されていない場合は、WebLogic Server EJB コンテナによって自動的にトランザクションのタイムアウトが設定されます。コンテナでは TimeoutSeconds
コンフィグレーション パラメータの値が使用されます。デフォルトの timeout 値は 30 秒です。
トランザクションのコンフィグレーション パラメータの詳細については、「トランザクションのコンフィグレーションと管理」および Administration Console オンライン ヘルプを参照してください。
コンテナ管理のトランザクションを使用する EJB の場合、EJB は javax.transaction.UserTransaction
インタフェースにアクセスすることができず、また、開始と終了のトランザクション コンテキストが一致していなければなりません。さらに、コンテナ管理のトランザクションを使用する EJB では、javax.ejb.EJBContext
インタフェースの setRollbackOnly
メソッドと getRollbackOnly
メソッドのサポートが制限されています (EJB 仕様 2.0 のセクション 16.4.4.2 と 16.4.4.3 で規定されている規則によって呼び出しが制限される)。
Bean 管理のトランザクションの場合は、Bean が javax.transaction.UserTransaction
インタフェースのメソッドを使用してトランザクションの境界設定を指定します。Bean 管理のトランザクションには、transaction-type
が Bean
に設定されているステートフルまたはステートレスのセッション Bean が含まれます。エンティティ Bean では、Bean 管理のトランザクションは使用できません。
ステートレス セッション Bean の場合は、開始と終了のトランザクション コンテキストが一致していなければなりません。ステートフル セッション Bean の場合は、開始と終了のトランザクション コンテキストが必ずしも一致している必要はありません。一致していない場合は、WebLogic Server EJB コンテナによって Bean と未終了のトランザクションの関連が維持されます。
Bean 管理のトランザクションを使用するセッション Bean では、javax.ejb.EJBContext
インタフェースの setRollbackOnly
メソッドと getRollbackOnly
メソッドが使用できません。
EJB 仕様 2.0 で「トランザクションに関与」という表現が使用されるとき、それは Bean が以下のいずれかの条件を満たしているという意味に解釈できます。
EJB 仕様 2.0 では、EJB の種類 (エンティティ Bean、ステートレス セッション Bean、またはステートフル セッション Bean) とトランザクションの種類 (コンテナ管理または Bean 管理) に基づいてトランザクション処理の動作を決定するセマンティクスが規定されています。それらのセマンティクスでは、メソッドが呼び出されるときのトランザクション コンテキストが規定されており、また、EJB が javax.transaction.UserTransaction
インタフェースのメソッドにアクセスできるかどうかが定義されています。EJB アプリケーションは、それらのセマンティクスに注意して設計する必要があります。
コンテナ管理のトランザクションの場合、トランザクション セマンティクスは Bean の種類によって異なります。
表 5-1 は、コンテナ管理のトランザクションのステートフル セッション Bean のトランザクション セマンティクスを示しています。
表 5-2 は、コンテナ管理のトランザクションのステートレス セッション Bean のトランザクション セマンティクスを示しています。
表 5-3 は、コンテナ管理のトランザクションのエンティティ Bean のトランザクション セマンティクスを示しています。
Bean 管理のトランザクションの場合、トランザクション セマンティクスはステートフルとステートレスのセッション Bean で異なります。エンティティ Bean では、Bean 管理のトランザクションは利用できません。
表 5-4 は、Bean 管理のトランザクションのステートフル セッション Bean のトランザクション セマンティクスを示しています。
表 5-5 は、Bean 管理のトランザクションのステートレス セッション Bean のトランザクション セマンティクスを示しています。
コンテナ管理のトランザクションを使用するステートフル セッション Bean では、javax.ejb.SessionSynchronization
インタフェースを実装してトランザクション同期通知を提供できます。その場合、ステートフル セッション Bean のすべてのメソッドでは、REQUIRES_NEW
、MANDATORY
、または REQUIRED
のいずれかのトランザクション属性をサポートしなければなりません。javax.ejb.SessionSynchronization
インタフェースの詳細については、EJB 仕様 2.0 のセクション 6.5.3 を参照してください。
Bean で SessionSynchronization
が実装されている場合、通常、WebLogic Server EJB コンテナではトランザクションのコミット時に Bean に対して以下のコールバックが行われます。
EJB コンテナは、beforeCompletion
メソッドで他の Bean を呼び出すか、または XA リソースを追加することができます。呼び出しの回数は、beforeCompletionIterationLimit
属性によって制限されます。この属性は、トランザクションがロールバックされるまでに処理されるコールバックのサイクル数を指定します。同期サイクルは、登録されているオブジェクトが beforeCompletion
コールバックを受信し、リソースが追加されるか、または以前に同期されていたオブジェクトが再登録されたときに発生します。反復制限を利用することで、同期サイクルが無限に繰り返されることを防止できます。
EJB アプリケーションのトランザクションには、タイムアウトを指定できます。トランザクションの存続期間がタイムアウトの設定値を超えた場合、トランザクション サービスによってそのトランザクションは自動的にロールバックされます。
注意 : トランザクションで begin()
を実行する前に、タイムアウトを設定する必要があります。タイムアウトを設定しても、すでに開始されているトランザクションには反映されません。
タイムアウトの指定方法は、トランザクションの種類によって異なります。
weblogic-ejb-jar.xml
デプロイメント記述子で trans-timeout-seconds
属性をコンフィグレーションします。詳細については、『WebLogic Server のコンフィグレーションと管理』を参照してください。UserTransaction.setTransactionTimeout
メソッドが呼び出されます。
WebLogic Server EJB アプリケーションでは、トランザクションの途中で送出された特定の例外を検出して処理する必要があります。例外処理の詳細については、Sun Microsystems 発行の EJB 仕様 2.0 の第 17 章「Exception Handling」を参照してください。
EJB トランザクションでビジネス メソッドによって例外がどのように送出されるのかについては、セクション 17.3 にある表 12 (コンテナ管理のトランザクション) および表 13 (Bean 管理のトランザクション) を参照してください。
クライアントの観点から見た例外については、セクション 17.4 を参照してください。特に、セクション 17.4.1 (アプリケーション例外)、セクション 17.4.2 (java.rmi.RemoteException
)、セクション 17.4.2.1 (javax.transaction.TransactionRolledBackException
)、およびセクション 17.4.2.2 (javax.transaction.TransactionRequiredException
) の参照をお勧めします。
![]() ![]() |
![]() |
![]() |