3.2.5 XAインタフェースによるトランザクション制御
XAインタフェースによるトランザクション制御について説明します。
- 〈この項の構成〉
(1) XAインタフェースの概要
XAインタフェースは,X/Openが規定したDTPモデルの一部です。
XAインタフェースとは,トランザクションマネジャとリソースマネジャとの間の指示のやり取りを規定したものです。したがって,UAPがXAインタフェースを直接使用することはありません。TP1/EEとリソースマネジャが使用するXAライブラリ・サブルーチンについては,マニュアル「OpenTP1 解説」のXAインタフェースについての説明を参照してください。
(2) XAインタフェースによるコネクション制御
リソースマネジャとのコネクションは,処理要求(トランザクション)ごとに確立・解放するかどうかを選択できます。コネクションをトランザクションごとに確立・解放するかどうかは,トランザクション関連定義のtrn_rm_open_close_scopeオペランドで指定します。
なお,HiRDBと連携する場合の環境設定については「6.8.2(1) 環境設定(HiRDB連携時)」を,Oracleと連携する場合の環境設定については「6.8.3(1) 環境設定(Oracle連携時)」を参照してください。
(a) トランザクションごとに確立・解放しない場合
トランザクションの実行性能を優先したい場合は,trn_rm_open_close_scopeオペランドの指定を省略するか,またはprocessを指定してください。TP1/EEは,xa_open関数を呼び出して1対1のコネクションをリソースマネジャと確立します。確立したコネクションは,xa_close関数を呼び出すことで解放されます。xa_open関数は,処理スレッドの開始処理の中で呼び出され,処理スレッドの起動中は常にxa_open関数呼び出し後の状態になります。したがって,トランザクションごとにコネクションを確立・解放することがありません。このため,コネクション制御時のオーバヘッドを軽減できます。
(b) トランザクションごとに確立・解放する場合
次に示す場合は,trn_rm_open_close_scopeオペランドにtransactionを指定してください。
-
リソースマネジャの資源を有効利用したい場合
-
リソースマネジャの障害を復旧したあとのSQLが,コネクションの切断によってエラーとなるのを回避したい場合
リソースマネジャによっては,TP1/EEまたはリソースマネジャがトランザクションの開始時またはSQLの実行時にコネクションを再接続します。この場合,コネクションの切断が要因となるSQLエラーは発生しません。コネクションが切断された場合の再接続については,各リソースマネジャのマニュアルを参照してください。
trn_rm_open_close_scopeオペランドにtransactionを指定した場合,TP1/EEはトランザクションの開始時にxa_open関数を発行してコネクションを確立し,トランザクションの終了時にxa_close関数を発行してコネクションを解放します。ただし,APIによる連鎖モードのコミットおよび連鎖モードのロールバックの場合は,UAPリターン後のトランザクション終了時にxa_close関数を発行します。
(3) 処理スレッドを使用したアンディレード回復時のコネクション制御
プロセスダウン後にアンディレード回復を実行する場合,トランザクション関連定義のtrn_undelayed_recover_threadオペランドにYを指定すると,回復スレッドと処理スレッドの両方を使用してプロセスを回復させることができます。回復スレッドだけではなく処理スレッドも使用することによって,アンディレード回復処理に掛かる時間を短縮できます。
処理スレッドを使用したアンディレード回復の場合,スレッド開始処理時ではなく,トランザクション開始時にxa_open関数を呼び出して,リソースマネジャとのコネクションを確立します。コネクションの確立に成功した場合,次回のトランザクション開始時にはxa_open関数を呼び出す必要がありません。
アンディレード回復の詳細については,「11.1.2(2) アンディレード回復」を参照してください。
(4) xa_open関数のリトライ
TP1/EE開始時およびトランザクション開始時にリソースマネジャのオープン処理(xa_open関数)でエラーが発生した場合は,xa_open関数の呼び出しをリトライします。リトライ回数はトランザクション関連定義のtrn_retry_count_rm_openオペランドまたはtrn_retry_count_rm_open_mimeオペランドで,リトライ間隔はトランザクション関連定義のtrn_retry_interval_rm_openオペランドまたはtrn_retry_interval_rm_open_mimeオペランドで指定します。リトライ回数がtrn_retry_count_rm_openオペランドまたはtrn_retry_count_rm_open_mimeオペランドの指定値を超えた場合は,エラーメッセージが出力されたあと,トランザクション関連定義のtrn_wait_rm_openオペランドの指定値に従って処理されます。ただし,前回のリソースマネジャのオープン処理でエラーが発生していた場合は,エラーメッセージは出力されません。