2.7.3 CMT
EJBコンテナでトランザクション管理をするモデルです。CMTは,Session Bean,Entity Bean,Message-driven Beanが対象です。CMTでは,Beanのメソッド単位でトランザクションの属性を指定します。なお,トランザクション属性は,J2EEアプリケーションに含まれるSession Bean,Entity Bean,またはMessage-driven Beanの属性(プロパティ)として設定します。J2EEアプリケーションの設定については,「2.7.4 cosminexus.xmlでの定義」を参照してください。
トランザクションがコミットできない場合,EJBコンテナは次の処理をします。
-
アプリケーションエラーのロギング
-
トランザクションのロールバック
-
Beanインスタンスの破棄
-
リモートコンポーネントインタフェースで呼び出すクライアントにはjava.rmi.RemoteException,ローカルコンポーネントインタフェースまたはビジネスインタフェースで呼び出すクライアントにはjavax.ejb.EJBExceptionを送出。ただし,リモートビジネスインタフェースがjava.rmi.Remoteを継承している場合には,java.rmi.RemoteExceptionを送出
- 〈この項の構成〉
(1) トランザクション属性の種類と振る舞い
トランザクション属性の振る舞いについて,トランザクション属性の種類ごとに図に示して説明します。
-
クライアントがトランザクションスコープ内でEnterprise Beanのビジネスメソッドを呼び出したとき,トランザクションコンテキストはEnterprise Bean側には伝播しません。また,クライアントがトランザクションスコープ外でEnterprise Beanのビジネスメソッドを呼び出したときも,トランザクションコンテキストはEnterprise Beanには伝播しません。
NotSupported属性の振る舞いを次の図に示します。
図2‒7 NotSupported属性 -
クライアントがトランザクションスコープ内でEnterprise Beanのビジネスメソッドを呼び出したとき,トランザクションコンテキストがEnterprise Bean側に伝播し,Enterprise Beanのビジネスメソッドは呼び出し側のトランザクションスコープ内に入ります。また,クライアントがトランザクションスコープ外でEnterprise Beanのビジネスメソッドを呼び出したとき,Enterprise Bean側で新しいトランザクションが開始されます。
Required属性の振る舞いを次の図に示します。
図2‒8 Required属性 -
クライアントがトランザクションスコープ内でEnterprise Beanのビジネスメソッドを呼び出したとき,トランザクションコンテキストがEnterprise Bean側に伝播し,Enterprise Beanのビジネスメソッドは呼び出し側のトランザクションスコープ内に入ります。また,クライアントがトランザクションスコープ外でEnterprise Beanのビジネスメソッドを呼び出したとき,トランザクションコンテキストはEnterprise Beanに伝播しません。
Supports属性の振る舞いを次の図に示します。
図2‒9 Supports属性 -
クライアントがトランザクションスコープ内でEnterprise Beanのビジネスメソッドを呼び出したとき,EJBコンテナは新しいトランザクションを開始します。また,クライアントがトランザクションスコープ外でEnterprise Beanのビジネスメソッドを呼び出したときも,同様に新しいトランザクションがEJBコンテナによって開始されます。
RequiresNew属性の振る舞いを次の図に示します。
図2‒10 RequiresNew属性 -
クライアントがトランザクションスコープ内でEnterprise Beanのビジネスメソッドを呼び出したとき,トランザクションコンテキストがEnterprise Bean側に伝播し,Enterprise Beanのビジネスメソッドは呼び出し側のトランザクションスコープ内に入ります。また,クライアントがトランザクションスコープ外でEnterprise Beanのビジネスメソッドを呼び出したとき,EJBコンテナはクライアントに次の例外を送出します。
-
ビジネスインタフェースを使用している場合,javax.ejb.EJBTransactionRequiredExceptionを送出します。ただし,java.rmi.Remoteを継承しているリモートビジネスインタフェースの場合は,javax.transaction.TransactionRequiredExceptionを送出します。
-
リモートコンポーネントインタフェースを使用している場合,javax.transaction.TransactionRequiredExceptionを送出します。
-
ローカルコンポーネントインタフェースを使用している場合,javax.ejb.TransactionRequiredLocalExceptionを送出します。
Mandatory属性の振る舞いを次の図に示します。
図2‒11 Mandatory属性 -
-
クライアントがトランザクションスコープ内でEnterprise Beanのビジネスメソッドを呼び出したとき,EJBコンテナはクライアントに次の例外を送出します。
-
ビジネスインタフェースを使用している場合,javax.ejb.EJBExceptionを送出します。ただし,java.rmi.Remoteを継承しているリモートビジネスインタフェースの場合は,java.rmi.RemoteExceptionを送出します。
-
リモートコンポーネントインタフェースを使用している場合,java.rmi.RemoteExceptionを送出します。
-
ローカルコンポーネントインタフェースを使用している場合,javax.ejb.EJBExceptionを送出します。
また,クライアントがトランザクションスコープ外でEnterprise Beanのビジネスメソッドを呼び出したとき,トランザクションコンテキストはEnterprise Beanに伝播しません。
Never属性の振る舞いを次の図に示します。
図2‒12 Never属性 -
(2) Enterprise Beanの種別ごとに指定できるトランザクション属性
Enterprise Beanの種別ごとに指定できるトランザクション属性およびデフォルト値を次の表に示します。EJB仕様ではBean種別ごとに指定できるトランザクション属性が規定されています。CMP 2.0については,EJB仕様でオプションとされている,ほかのトランザクション属性は指定できません。デフォルト値についてはEJB仕様では規定されていません。アプリケーションサーバの場合,EJBのDDでCMTの指定があり,トランザクション属性の指定がない場合のデフォルト設定は,次の表のようになります。
種別 |
指定できるトランザクション属性 |
デフォルト値 |
---|---|---|
|
|
Supports |
Stateful Session Bean (SessionSynchronization) |
|
Required |
Singleton Session Bean (PostConstruct/PreDestroyを除く)※1 |
|
Required |
Entity Bean(CMP 2.0) |
|
Required |
Message-driven Bean(Connector 1.0に準拠したリソースアダプタを使用する場合) |
|
Required |
Message-driven Bean(Connector 1.5に準拠したリソースアダプタを使用する場合) |
|
Required※2 |
アノテーションを使用した,DDを持たないSession Bean |
|
Required |
(3) Stateful Session Bean(SessionSynchronization)のトランザクション属性
SessionSynchronizationは,トランザクションの開始および停止に同期してメッセージを通知するためのインタフェースです。EJB仕様では,SessionSynchronizationを実装したStateful Session Beanのトランザクション属性に指定できるのは,Required,RequiresNewまたはMandatoryと規定されています。これに対して,アプリケーションサーバでは,Supports,NotSupportedおよびNeverも指定できます。
ここでは,指定したトランザクション属性とメソッド呼び出しの有無の対応,およびコールバックメソッドを呼び出すタイミングについて説明します。なお,コールバックメソッドとは,次のメソッドのことです。
- afterBeginメソッド
-
次のどちらかのメソッドです。
-
javax.ejb.SessionSynchronizationインタフェースのafterBeginメソッドを実装したメソッド
-
@AfterBeginを指定したメソッド
-
- beforeCompletionメソッド
-
次のどちらかのメソッドです。
-
javax.ejb.SessionSynchronizationインタフェースのbeforeCompletionメソッドを実装したメソッド
-
@BeforeCompletionを指定したメソッド
-
- afterCompletionメソッド
-
次のどちらかのメソッドです。
-
javax.ejb.SessionSynchronizationインタフェースのafterCompletionメソッドを実装したメソッド
-
@AfterCompletionを指定したメソッド
-
なお,アノテーションの利用については,「2.18 Session Synchronizationのアノテーションでの指定」を参照してください。
(a) トランザクション属性とメソッド呼び出しの有無
SessionSynchronizationを実装したStateful Session Beanのトランザクション属性と,ビジネスメソッドまたはコールバックメソッドの呼び出し有無の対応について,次の表に示します。
トランザクション属性 |
クライアントのトランザクション有無 |
ビジネスメソッドの呼び出し |
SessionSynchronizationのコールバックメソッド呼び出し |
---|---|---|---|
Supports |
あり |
○※1 |
○※1 |
なし |
○※1 |
× |
|
NotSupported |
あり |
○※1 |
× |
なし |
○※1 |
× |
|
Required |
あり |
○ |
○ |
なし |
○ |
○ |
|
RequiresNew |
あり |
○ |
○ |
なし |
○ |
○ |
|
Mandatory |
あり |
○ |
○ |
なし |
×※2 |
× |
|
Never |
あり |
×※2 |
× |
なし |
○※1 |
× |
(b) コールバックメソッドを呼び出すタイミング
同一のEnterprise Beanのビジネスメソッドを複数回呼び出す場合,トランザクションに最初にEntprise Beanが参加するタイミングで,コールバックメソッドであるafterBeginメソッドが呼び出されます。
afterBeginメソッドを呼び出すタイミングの例として,トランザクションに参加しないビジネスメソッド実行後にトランザクションに参加するビジネスメソッドを実行した場合の動作を次の図に示します。