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コンテナは次の処理をします。
トランザクション属性の振る舞いについて,トランザクション属性の種類ごとに図に示して説明します。
クライアントがトランザクションスコープ内で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コンテナはクライアントに次の例外を送出します。
Mandatory属性の振る舞いを次の図に示します。
図2-11 Mandatory属性
クライアントがトランザクションスコープ内でEnterprise Beanのビジネスメソッドを呼び出したとき,EJBコンテナはクライアントに次の例外を送出します。
また,クライアントがトランザクションスコープ外でEnterprise Beanのビジネスメソッドを呼び出したとき,トランザクションコンテキストはEnterprise Beanに伝播しません。
Never属性の振る舞いを次の図に示します。
図2-12 Never属性
Enterprise Beanの種別ごとに指定できるトランザクション属性およびデフォルト値を次の表に示します。EJB仕様ではBean種別ごとに指定できるトランザクション属性が規定されています。CMP 2.0については,EJB仕様でオプションとされている,ほかのトランザクション属性は指定できません。デフォルト値についてはEJB仕様では規定されていません。アプリケーションサーバの場合,EJBのDDでCMTの指定があり,トランザクション属性の指定がない場合のデフォルト設定は,次の表のようになります。
表2-18 Enterprise Beanの種別ごとに指定できるトランザクション属性およびデフォルト値
種別 | 指定できるトランザクション属性 | デフォルト値 |
---|---|---|
|
| 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 |
SessionSynchronizationは,トランザクションの開始および停止に同期してメッセージを通知するためのインタフェースです。EJB仕様では,SessionSynchronizationを実装したStateful Session Beanのトランザクション属性に指定できるのは,Required,RequiresNewまたはMandatoryと規定されています。これに対して,アプリケーションサーバでは,Supports,NotSupportedおよびNeverも指定できます。
ここでは,指定したトランザクション属性とメソッド呼び出しの有無の対応,およびコールバックメソッドを呼び出すタイミングについて説明します。なお,コールバックメソッドとは,次のメソッドのことです。
なお,アノテーションの利用については,「2.18 Session Synchronizationのアノテーションでの指定」を参照してください。
SessionSynchronizationを実装したStateful Session Beanのトランザクション属性と,ビジネスメソッドまたはコールバックメソッドの呼び出し有無の対応について,次の表に示します。
表2-19 ビジネスメソッドまたはコールバックメソッドでのメソッド呼び出し有無
トランザクション属性 | クライアントのトランザクション有無 | ビジネスメソッドの呼び出し | SessionSynchronizationのコールバックメソッド呼び出し |
---|---|---|---|
Supports | あり | ○※1 | ○※1 |
なし | ○※1 | × | |
NotSupported | あり | ○※1 | × |
なし | ○※1 | × | |
Required | あり | ○ | ○ |
なし | ○ | ○ | |
RequiresNew | あり | ○ | ○ |
なし | ○ | ○ | |
Mandatory | あり | ○ | ○ |
なし | ×※2 | × | |
Never | あり | ×※2 | × |
なし | ○※1 | × |
同一のEnterprise Beanのビジネスメソッドを複数回呼び出す場合,トランザクションに最初にEntprise Beanが参加するタイミングで,コールバックメソッドであるafterBeginメソッドが呼び出されます。
afterBeginメソッドを呼び出すタイミングの例として,トランザクションに参加しないビジネスメソッド実行後にトランザクションに参加するビジネスメソッドを実行した場合の動作を次の図に示します。
図2-13 コールバックメソッドを呼び出すタイミングの例