3.4.6 トランザクションマネージャの取得
トランザクションマネージャ(javax.transaction.TransactionManagerまたはjavax.transaction.Transaction)は,トランザクションを管理するためのAPIを提供します。トランザクションマネージャのAPIを使用するフレームワークを使用する場合は,JNDIを使用してトランザクションマネージャを取得できます。トランザクションマネージャを取得するには,「java:comp/TransactionManager」の名前でルックアップします。
アプリケーションサーバがサポートするトランザクションマネージャのAPI,およびSynchronizationを使用する場合の注意について説明します。
(1) サポートするAPI
アプリケーションサーバがサポートするトランザクションマネージャのAPIを次の表に示します。
インタフェース |
メソッド |
使用可否 |
---|---|---|
javax.transaction.TransactionManager |
begin |
○ |
commit |
○ |
|
getStatus |
○ |
|
getTransaction |
○ |
|
resume |
○ |
|
rollback |
○ |
|
setRollbackOnly |
○ |
|
setTransactionTimeout |
○ |
|
suspend |
○ |
|
javax.transaction.Transaction |
commit |
○ |
delistResource |
− |
|
enlistResource |
− |
|
getStatus |
○ |
|
registerSynchronization |
○ |
|
rollback |
○ |
|
setRollbackOnly |
○ |
(2) トランザクションマネージャを使用する場合の注意事項
-
ルックアップで取得したトランザクションマネージャを使用する場合,トランザクション管理に含める処理(データベースのコネクションの取得,使用,解放など)は,トランザクションの開始後から決着前,または開始後から中断前および再開後から決着前の範囲内で実装してください。トランザクションの開始前や決着後,中断中に実装された処理はトランザクション管理に含まれません。
-
トランザクションマネージャを使用してトランザクションを制御するコンポーネントでは,UserTransactionを使用しないでください。
-
トランザクションマネージャ(javax.transaction.TransactionManager)のbeginメソッドで開始したトランザクションは,beginメソッドの呼び出し前にsetTransactionTimeoutメソッドでタイムアウト時間を指定した場合,指定された時間でタイムアウトします。setTransactionTimeoutメソッドを呼び出していない場合は,簡易構築定義ファイルの論理J2EEサーバのプロパティejbserver.jta.TransactionManager.defaultTimeOutの指定値(デフォルト180秒)でタイムアウトします。
(3) Synchronizationを使用する場合の注意事項
トランザクション(javax.transaction.Transaction)のregisterSynchronizationメソッドで登録するSynchronization(javax.transaction.Synchronization)のbeforeCompletionメソッド,およびafterCompletionメソッドでは,J2EEサーバが提供するサービスを使用できません。使用できないサービスの例を次に示します。
-
リソースアクセス
-
UserTransactionまたはCMTによるトランザクション操作
-
EJBアクセス
-
JNDIアクセス
これらのサービスのうちリソースアクセスを行った場合,リソースアクセスでトランザクションマネージャが管理するトランザクションの一部として管理されないため,不整合が発生することがあります。リソースアクセスをする場合は,フレームワークの責任で,フレームワークがリソースに対して直接トランザクションを制御するようにしてください。
上記のような注意事項があるため,ユーザプログラムでSynchronizationを利用することは推奨しません。ユーザプログラムからトランザクション決着のタイミングを利用したい場合には,EJBのjavax.ejb.SessionSynchronizationを使用してください。