ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JTA プログラマーズ ガイド
11g リリース 1 (10.3.1)
B55540-01
 

目次
目次

戻る
戻る
 
次へ
次へ
 

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

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

この章では、Oracle WebLogic Server で動作するエンタープライズ JavaBean (EJB) アプリケーションでトランザクションを実装する方法について説明します。

始める前に

本題に入る前に、「トランザクションについて」を一読してください。その際、特に重要となるのは以下の節です。

ここでは、エンタープライズ JavaBean でのトランザクションの Oracle WebLogic Server 実装について説明します。ここで説明する情報は、Sun Microsystems 発行の EJB 仕様 2.1 を補足するものです。


注意 :

この章を読み進める前に、EJB 仕様 2.1 のドキュメントの内容、特に「Support for Transactions」に記載されている概念やデータをよく理解しておく必要があります。

WebLogic Server アプリケーションでのエンタープライズ JavaBean の実装については、『Oracle Fusion Middleware Oracle WebLogic Server エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』を参照してください。

ガイドライン

以下のガイドラインは、WebLogic Server 向けの EJB アプリケーションでトランザクションを実装するときに適用されます。

WebLogic Server トランザクション サービスのガイドラインについては、「機能と制限」を参照してください。

トランザクション属性

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

EJB のトランザクション属性について

トランザクション属性では、トランザクションが EJB アプリケーションでどのように管理されるのかが指定されます。各 EJB について、トランザクション属性により、トランザクションの境界が WebLogic Server EJB コンテナによって設定されるのか (コンテナ管理のトランザクション)、または EJB 自体によって設定されるのか (Bean 管理のトランザクション) が指定されます。EJB がコンテナ管理と Bean 管理のどちらであるのかは、デプロイメント記述子の transaction-type 要素の設定で決まります。transaction-type 要素の詳細については、EJB 仕様 2.1 の「Support for Transactions」と「Deployment Descriptor」を参照してください。

概して、Bean 管理のトランザクションよりもコンテナ管理のトランザクションの方がよく使用されます。なぜなら、その方がアプリケーションのコードがシンプルになるからです。たとえば、コンテナ管理のトランザクションでは、トランザクションを明示的に開始する必要がありません。

WebLogic Server では、EJB 仕様 2.1 のセクション 16.4 で定義されているメソッド レベルのトランザクション属性が完全にサポートされています。

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

コンテナ管理のトランザクションの場合、トランザクション属性はデプロイメント記述子の container-transaction 要素で指定します。コンテナ管理のトランザクションには、すべてのエンティティ Bean と、transaction-typeContainer に設定されているステートフルまたはステートレスのセッション Bean が含まれます。これらの要素に関する詳細については、『Oracle Fusion Middleware Oracle WebLogic Server エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』を参照してください。

EJB とそのビジネス メソッドに対して指定できるトランザクション属性は以下のとおりです。

  • NotSupported

  • Supports

  • Required

  • RequiresNew

  • Mandatory

  • Never

trans-attribute 設定で WebLogic Server EJB コンテナがどのように機能するのかについては、EJB 仕様 2.1 のセクション 17.6.2 (http://java.sun.com/products/ejb/docs.html) を参照してください。

デプロイメント記述子でタイムアウト値が定義されていない場合は、WebLogic Server EJB コンテナによって自動的にトランザクションのタイムアウトが設定されます。コンテナでは TimeoutSeconds コンフィグレーション パラメータの値が使用されます。デフォルトの timeout 値は 30 秒です。

コンテナ管理のトランザクションを使用する EJB の場合、EJB は javax.transaction.UserTransaction インタフェースにアクセスすることができず、また、開始と終了のトランザクション コンテキストが一致していなければなりません。さらに、コンテナ管理のトランザクションを使用する EJB では、javax.ejb.EJBContext インタフェースの setRollbackOnly メソッドと getRollbackOnly メソッドのサポートが制限されています (EJB 仕様 2.1 のセクション 16.4.4.2 と 16.4.4.3 で規定されている規則によって呼び出しが制限される)。

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

Bean 管理のトランザクションの場合は、Bean が javax.transaction.UserTransaction インタフェースのメソッドを使用してトランザクションの境界設定を指定します。Bean 管理のトランザクションには、transaction-typeBean に設定されているステートフルまたはステートレスのセッション Bean が含まれます。エンティティ Bean では、Bean 管理のトランザクションは使用できません。

ステートレス セッション Bean の場合は、開始と終了のトランザクション コンテキストが一致していなければなりません。ステートフル セッション Bean の場合は、開始と終了のトランザクション コンテキストが必ずしも一致している必要はありません。一致していない場合は、WebLogic Server EJB コンテナによって Bean と未終了のトランザクションとの関連が維持されます。

Bean 管理のトランザクションを使用するセッション Bean では、javax.ejb.EJBContext インタフェースの setRollbackOnly メソッドと getRollbackOnly メソッドは使用できません。

トランザクションへの参加

EJB 仕様 2.1 で使用される「トランザクションに参加する」という表現は、Bean が以下のいずれかの条件を満たしていると解釈します。

トランザクション セマンティクス

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

EJB 仕様 2.1 では、EJB の種類 (エンティティ Bean、ステートレス セッション Bean、またはステートフル セッション Bean) とトランザクションの種類 (コンテナ管理または Bean 管理) に基づいてトランザクション処理の動作を決定するセマンティクスが規定されています。それらのセマンティクスでは、メソッドが呼び出されるときのトランザクション コンテキストが規定されており、また、EJB が javax.transaction.UserTransaction インタフェースのメソッドにアクセスできるかどうかが定義されています。EJB アプリケーションは、それらのセマンティクスに注意して設計する必要があります。

コンテナ管理のトランザクションのトランザクション セマンティクス

コンテナ管理のトランザクションの場合、トランザクション セマンティクスは Bean の種類によって異なります。

ステートフル セッション Bean のトランザクション セマンティクス

表 8-1 は、コンテナ管理のトランザクションのステートフル セッション Bean のトランザクション セマンティクスを示したものです。

表 8-1 コンテナ管理のトランザクションのステートフル セッション Bean のトランザクション セマンティクス

メソッド メソッドが起動された時点でのトランザクション コンテキスト ユーザ トランザクション メソッドへのアクセスの可否
コンストラクタ

指定なし

不可

setSessionContext()

指定なし

不可

ejbCreate()

指定なし

不可

ejbRemove()

指定なし

不可

ejbActivate()

指定なし

不可

ejbPassivate()

指定なし

不可

ビジネス メソッド

トランザクション属性によって有または無

不可

afterBegin()

不可

beforeCompletion()

不可

afterCompletion()

不可


ステートレス セッション Bean のトランザクション セマンティクス

表 8-2 は、コンテナ管理のトランザクションのステートレス セッション Bean のトランザクション セマンティクスを示したものです。

表 8-2 コンテナ管理のトランザクションのステートレス セッション Bean のトランザクション セマンティクス

メソッド メソッドが起動された時点でのトランザクション コンテキスト ユーザ トランザクション メソッドへのアクセスの可否
コンストラクタ

指定なし

不可

setSessionContext()

指定なし

不可

ejbCreate()

指定なし

不可

ejbRemove()

指定なし

不可

ビジネス メソッド

トランザクション属性によって有または無

不可


エンティティ Bean のトランザクション セマンティクス

表 8-3 は、コンテナ管理のトランザクションのエンティティ Bean のトランザクション セマンティクスを示したものです。

表 8-3 コンテナ管理のトランザクションのエンティティ Bean のトランザクション セマンティクス

メソッド メソッドが起動された時点でのトランザクション コンテキスト ユーザ トランザクション メソッドへのアクセスの可否

コンストラクタ

指定なし

不可

setEntityContext()

指定なし

不可

unsetEntityContext()

指定なし

不可

ejbCreate()

対応する create のトランザクション属性で決まる

不可

ejbPostCreate()

対応する create のトランザクション属性で決まる

不可

ejbRemove()

対応する remove のトランザクション属性で決まる

不可

ejbFind()

対応する find のトランザクション属性で決まる

不可

ejbActivate()

指定なし

不可

ejbPassivate()

指定なし

不可

ejbLoad()

ejbLoad() を呼び出したビジネス メソッドのトランザクション属性で決まる

不可

ejbStore()

ejbStore() を呼び出したビジネス メソッドのトランザクション属性で決まる

不可

ビジネス メソッド

トランザクション属性によって有または無

不可


Bean 管理のトランザクションのトランザクション セマンティクス

Bean 管理のトランザクションの場合、トランザクション セマンティクスはステートフルとステートレスのセッション Bean で異なります。エンティティ Bean では、Bean 管理のトランザクションは利用できません。

ステートフル セッション Bean のトランザクション セマンティクス

表 8-4 は、Bean 管理のトランザクションのステートフル セッション Bean のトランザクション セマンティクスを示したものです。

表 8-4 Bean 管理のトランザクションのステートフル セッション Bean のトランザクション セマンティクス

メソッド メソッドが起動された時点でのトランザクション コンテキスト ユーザ トランザクション メソッドへのアクセスの可否

コンストラクタ

指定なし

不可

setSessionContext()

指定なし

不可

ejbCreate()

指定なし

ejbRemove()

指定なし

ejbActivate()

指定なし

ejbPassivate()

指定なし

ビジネス メソッド

通常は不可 (Bean での直前のメソッド実行がトランザクション コンテキストの中で終了している場合を除く)

afterBegin()

非適用

非適用

beforeCompletion()

非適用

非適用

afterCompletion()

非適用

非適用


ステートレス セッション Bean のトランザクション セマンティクス

表 8-5 は、Bean 管理のトランザクションのステートレス セッション Bean のトランザクション セマンティクスを示したものです。

表 8-5 Bean 管理のトランザクションのステートレス セッション Bean のトランザクション セマンティクス

メソッド メソッドが起動された時点でのトランザクション コンテキスト ユーザ トランザクション メソッドへのアクセスの可否

コンストラクタ

指定なし

不可

setSessionContext()

指定なし

不可

ejbCreate()

指定なし

ejbRemove()

指定なし

ビジネス メソッド


セッションの同期

コンテナ管理のトランザクションを使用するステートフル セッション Bean では、javax.ejb.SessionSynchronization インタフェースを実装してトランザクション同期通知を提供できます。その場合、ステートフル セッション Bean のすべてのメソッドでは、REQUIRES_NEWMANDATORY、または REQUIRED のいずれかのトランザクション属性をサポートしなければなりません。javax.ejb.SessionSynchronization インタフェースの詳細については、EJB 仕様 2.1 のセクション 6.5.3 を参照してください。

トランザクション時の同期

Bean で SessionSynchronization が実装されている場合、通常、WebLogic Server EJB コンテナではトランザクションのコミット時に Bean に対して以下のコールバックが行われます。

EJB コンテナは、beforeCompletion メソッドで他の Bean を呼び出すか、または XA リソースを追加することができます。呼び出しの回数は、beforeCompletionIterationLimit 属性によって制限されます。この属性は、トランザクションがロールバックされるまでに処理されるコールバックのサイクル数を指定します。同期サイクルは、登録されているオブジェクトが beforeCompletion コールバックを受信し、リソースが追加されるか、または以前に同期されていたオブジェクトが再登録されたときに発生します。反復制限を利用することで、同期サイクルが無限に繰り返されることを防止できます。

トランザクション タイムアウトの設定

EJB アプリケーションのトランザクションには、タイムアウトを指定できます。トランザクションの存続期間がタイムアウトの設定値を超えた場合、トランザクション サービスによってそのトランザクションは自動的にロールバックされます。


注意 :

トランザクションで begin() を実行する前に、タイムアウトを設定する必要があります。タイムアウトを設定しても、すでに開始されているトランザクションには反映されません。

タイムアウトの指定方法は、トランザクションの種類によって異なります。

EJB トランザクションでの例外処理

WebLogic Server EJB アプリケーションでは、トランザクションの途中で送出された特定の例外を検出して処理する必要があります。例外処理の詳細については、Sun Microsystems 発行の EJB 仕様 2.1 の「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) の参照をお勧めします。