Interstage Application Server J2EE ユーザーズガイド |
目次
索引
![]() ![]() |
第3部 EJB編 | > 第9章 EJBサービスの機能 | > 9.5 EJBサービスのトランザクション制御 |
本章では、以下について説明します。
トランザクションの制御方法や実行時の制御内容などを詳細に決定するために、トランザクション管理種別とトランザクション属性を定義します。
トランザクション管理種別とは、EJBアプリケーションのトランザクションを制御するための定義を行うもので、EJBアプリケーションごとに定義します。
トランザクション管理種別には、“Bean”と“Container”の2つがあります。以下に、各トランザクション管理種別の詳細を示します。
トランザクション管理種別 |
内容 |
Bean |
UserTransactionインタフェースを使用して、EJBアプリケーションがトランザクションの制御を行います。 この管理種別を指定できるEJBアプリケーションは、Session BeanとMessage-driven Beanです。 Session Beanでは、呼出し元でトランザクションが開始されている場合は、コンテナがそのトランザクションを中断します。処理が終了した後、中断していた呼出し元のトランザクションを再開します。 Message-driven Beanでは、メッセージの受信はトランザクションに含まれません。Destinationに送信されたメッセージはonMessageメソッドが終了した時点でJMSが自動的に受信確認(acknowledge)を行い、メッセージの受信を完了します。 |
Container |
トランザクション制御はコンテナが行います。 EJBアプリケーションにトランザクション処理の記述をしなくてよいため、EJBアプリケーションのポータビリティが向上し、最小単位の部品としてEJBアプリケーションを作成することができます。 この管理種別を指定した場合、実行時のトランザクション制御内容を指定するために、“トランザクション属性”を指定してください。 |
トランザクション管理種別がContainerの場合、javax.transaction.UserTransactionインタフェースを使用してトランザクションを制御しようとすると、IllegalStateExceptionが発生します。
トランザクション属性とは、実行時にコンテナが行うトランザクション制御の内容を指定するもので、トランザクション管理種別に“Container”を指定した場合に指定します。
EJBアプリケーションごと、または、EJBアプリケーションのメソッド単位で指定します。
以下に、各トランザクション属性の詳細を示します。
トランザクション属性 |
内容 |
Session Bean |
Entity Bean |
Message-driven Bean |
Mandatory |
この属性を指定したEJBアプリケーション(メソッド)は、常に呼出し元で開始されているトランザクションで実行されます。
|
○ |
○ |
− |
Required |
この属性を指定したEJBアプリケーション(メソッド)は、常にトランザクションが開始された状態で実行されます。呼出し元でトランザクションが開始されている場合と開始されていない場合で、トランザクションが異なります。
通常、メソッド実行完了後、トランザクションがcommitされます。当属性が指定されたBean(メソッド)内でトランザクションをrollbackする必要がある場合、SessionContext/EntityContext/MessageDrivenContextインタフェースのsetRollbackOnlyメソッドを使用してトランザクションをrollbackするようマーク(宣言)することができます。 一般的に、Entity Beanでこの属性を使用すると、可搬性の高いEJBアプリケーションを作成することができます。 Message-driven Beanの場合、メッセージの受信もトランザクションに含まれます。Message-driven Beanにメッセージが配信されると、コンテナがトランザクションを開始してからonMessageメソッドにメッセージを渡します。 注意事項) Message-driven Beanでこの属性を指定して、無条件にsetRollbackOnlyメソッドを使用してメッセージ受信をロールバックすると、メッセージの配信が繰り返されてループする可能性があります。処理を継続できないようなエラーが発生した場合には、setRollbackOnlyメソッドを実行するのではなく、EJBExceptionをthrowするなどして異常時のメッセージ退避機能を使用するようにしてください。 |
○ |
○ |
○ |
Supports |
この属性を指定したEJBアプリケーション(メソッド)は、呼出し元でトランザクションが開始されている場合と開始されていない場合で、実行される状態が異なります。
この属性は、トランザクションの一貫性・整合性が保たれない可能性があることから、EJB規約では推奨されない属性とされています。 |
○ |
○ |
− |
RequiresNew |
この属性を指定したEJBアプリケーション(メソッド)は、常にコンテナで開始されたトランザクションで実行されます。
この属性を指定すると、トランザクション排他処理の範囲を縮小してデータベースの占有を防止することができます。 |
○ |
○ |
− |
NotSupported |
この属性を指定したEJBアプリケーション(メソッド)は、常にトランザクションが開始されていない状態で実行されます。
Message-driven Beanの場合、メッセージが配信された時点でコンテナがメッセージの受信を完了します。 |
○ |
○ |
○ |
Never |
この属性を指定したEJBアプリケーション(メソッド)は、常にトランザクションが開始されていない状態で実行されます。
|
○ |
○ |
− |
○:サポート
−:用途なし
呼出し先のBeanに指定するトランザクション属性により、呼出し先のBeanと呼出し元のトランザクションの制御状態は以下のようになります。
呼出し先のBeanに指定した |
呼出し元での |
呼出し先での |
NotSupported |
none |
none |
T1 |
none |
|
Required |
none |
T2 |
T1 |
T1 |
|
Supports |
none |
none |
T1 |
T1 |
|
RequiresNew |
none |
T2 |
T1 |
T2 |
|
Mandatory |
none |
error |
T1 |
T1 |
|
Never |
none |
none |
T1 |
error |
none:トランザクションが開始されていない状態
T1:呼出し元で開始したトランザクションで動作している状態
T2:呼出し先で開始したトランザクションで動作している状態
error:エラーが発生
Mandatory、RequiredおよびSupportsを使用して、呼出し元のトランザクション(T1)で呼出し先のBeanを動作させる場合、以下の機能を使用してください。以下の機能を使用しない場合には、呼出し元のトランザクションは開始されていない状態(none)と判断して動作します。
トランザクション属性を指定するときは、以下の点に注意してください。
Bean種別 |
Homeインタフェースメソッド |
Remoteインタフェースメソッド |
LocalHomeインタフェースメソッド |
Localインタフェースメソッド |
Session Bean |
なし |
すべてのビジネスメソッド |
すべてのビジネスメソッド |
すべてのビジネスメソッド |
Entity Bean |
create() |
すべてのビジネスメソッド |
create() |
すべてのビジネスメソッド |
EJBサービスが提供するトランザクション機能を使用する場合、以下の点に注意してください。
分散トランザクションの指定はIJServerの定義時に指定します。指定方法についてはInterstage管理コンソールのヘルプを参照してください。“分散トランザクション機能”についての詳細は、JTS/JTA編を参照してください。
目次
索引
![]() ![]() |