ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JTAのプログラミング
11g リリース1 (10.3.6)
B61631-07
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

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

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

始める前に

開始する前に、第2章「トランザクションについて」(特に次のトピック)を読んでください。

ここでは、Enterprise JavaBeansでのトランザクションのOracle WebLogic Server実装について説明します。ここで説明する情報は、「Enterprise JavaBeans仕様2.1」を補足するものです。


注意:

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


WebLogic ServerアプリケーションでのEnterprise JavaBeansの実装については、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』を参照してください。

ガイドライン

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

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

トランザクション属性

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

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

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

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

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

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

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

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

  • NotSupported

  • Supports

  • Required

  • RequiresNew

  • Mandatory

  • Never

trans-attributeの設定に対するWebLogic Server EJBコンテナの反応については、EJB仕様2.1のセクション17.6.2 (http://www.oracle.com/technetwork/java/javaee/ejb/index.html)を参照してください。

デプロイメント記述子でタイムアウト値が定義されていない場合は、WebLogic Server EJBコンテナによって自動的にトランザクションのタイムアウトが設定されます。コンテナではTimeout Seconds構成パラメータの値が使用されます。デフォルトの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のトランザクション・セマンティクス

メソッド メソッドが起動された時点でのトランザクション・コンテキスト ユーザー・トランザクション・メソッドにアクセスできるか
Constructor

指定なし

いいえ

setSessionContext()

指定なし

いいえ

ejbCreate()

指定なし

いいえ

ejbRemove()

指定なし

いいえ

ejbActivate()

指定なし

いいえ

ejbPassivate()

指定なし

いいえ

ビジネス・メソッド

トランザクション属性によって「はい」または「いいえ」

いいえ

afterBegin()

はい

いいえ

beforeCompletion()

はい

いいえ

afterCompletion()

いいえ

いいえ


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

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

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

メソッド メソッドが起動された時点でのトランザクション・コンテキスト ユーザー・トランザクション・メソッドにアクセスできるか
Constructor

指定なし

いいえ

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()

指定なし

はい

Business method

通常は、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アプリケーションでは、トランザクションの途中でスローされた特定の例外を取得して処理する必要があります。例外処理の詳細は、EJB仕様2.1の第17章「Exception Handling」を参照してください。

EJBトランザクションでビジネス・メソッドによって例外がどのようにスローされるのかについては、セクション17.3にある表12 (コンテナ管理のトランザクション)および表13 (Bean管理のトランザクション)を参照してください。

クライアントの観点から見た例外については、セクション17.4を参照してください。特に、セクション12.4.1 (アプリケーション例外)、セクション17.4.2 (java.rmi.RemoteException)、セクション17.4.2.1 (javax.transaction.TransactionRolledBackException)、およびセクション17.4.2.2 (javax.transaction.TransactionRequiredException)の参照をお薦めします。