Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 TP1/Server Base Enterprise Option プログラム作成の手引


2.2.1 クライアント/サーバ形態の通信のトランザクション

TP1/EEでは,RPCを使用して複数のUAPプロセスにわたっている処理を,1件のトランザクション処理にできます。このようなトランザクションをグローバルトランザクションといいます。このグローバルトランザクションによって,クライアント/サーバ形態のトランザクションができるようになります。

クライアント/サーバ形態の通信でトランザクションを制御するときは,トランザクションの開始および終了同期点の取得をUAPで明示します。

〈この項の構成〉

(1) トランザクションの開始と終了

(a) トランザクションの開始

処理要求が発生した場合に,TP1/EEが,ルートトランザクション,またはトランザクションブランチとしてトランザクションを開始します。

(b) トランザクションの回復

トランザクション処理中に障害が発生した場合,ステータスファイル情報,またはテーブル状態を基にトランザクションを回復します。回復処理の詳細については,マニュアル「TP1/Server Base Enterprise Option 使用の手引」のプロセスの回復,およびスレッドの回復の説明を参照してください。

(c) トランザクションの縮退

トランザクション開始時に,リソースマネジャに障害が発生した場合は,障害が発生したリソースマネジャにアクセスできないトランザクションとして縮退して開始します。縮退情報は,トランザクションインタフェースおよびee_trn_getinfo関数【CBLEETRN('GETINFO ')】で取得できます。

トランザクション処理中に,リソースマネジャに障害が発生した場合も,障害が発生したリソースマネジャにアクセスできないトランザクションとして縮退して処理を続行します。縮退情報は,ee_trn_getinfo関数で取得できます。

注※

トランザクションの処理には,再起動トランザクションの起動処理(ee_trn_chained_commit関数【CBLEETRN('C-COMMIT')】またはEETRN_KEEPを指定したee_trn_chained_rollback関数【CBLEETRN('C-ROLL ')】の呼び出し)も含みます。

(d) トランザクションの終了

グローバルトランザクションは,コミットまたはロールバックのどちらかに決着して終了します。このとき,グローバルトランザクションとリンケージしたスレッドからの要求で実行したリソースマネジャの処理は,すべて実行される(コミット)か,またはすべて実行されない(ロールバック)かのどちらかです。

グローバルトランザクションの決着結果は,グローバルトランザクションのルートトランザクションブランチが完了する前に保持していた結果と一致します。グローバルトランザクションの決着結果と,グローバルトランザクションに属するトランザクションブランチのトランザクション決着結果との関係を次の表に示します。

表2‒3 トランザクション決着結果

グローバルトランザクションのトランザクション決着結果

各トランザクションブランチのトランザクション決着結果

COMMIT

グローバルトランザクションに属するすべてのトランザクションブランチがコミットできた状態。

ROLLBACK

グローバルトランザクションに属するトランザクションブランチの一つ以上がロールバックしたため,グローバルトランザクションがロールバックした状態。

HEURISTIC_HAZARD

障害のため,グローバルトランザクションに属するトランザクションブランチのうち,ヒューリスティックに完了したトランザクションブランチの決着結果が判明しない状態。

HEURISTIC_MIX

グローバルトランザクションに属するあるトランザクションブランチがコミットし,あるトランザクションブランチがロールバックした状態。ルートトランザクションブランチとトランザクションブランチの決着が矛盾している状態。

(2) 同期点の取得

グローバルトランザクションを構成するトランザクションブランチのすべてを,同期を取って同じ決着結果(コミットまたはロールバック)で終了させることを同期点の取得といいます。

(a) 同期点を取得する関数

同期点を取得するときは,次に示す関数を呼び出します。

  • ee_trn_chained_commit関数

  • ee_trn_chained_rollback関数

トランザクションとして実行中のUAPから要求されたサービスは,要求された時点ですでにトランザクションとして実行しています。

コミットの関数の呼び出し

トランザクションをUAPの判断でコミットとしたいときは,UAPからコミットを要求できます。

ロールバックの関数の呼び出し

トランザクションをUAPの判断でロールバックとしたいときは,UAPからロールバックを要求できます。関数を呼び出すときの指定で,該当するスレッドを強制終了させることもできます。

同期点を取得する処理でエラーが起こった場合

同期点を取得する関数の要求時,トランザクションの同期点を取得する処理でエラーが起こった場合は,エラーリターンします。

UAPがTP1/EEに制御を戻したあと,トランザクションの同期点を取得する処理でエラーが起こった場合は,エラートランザクション(ERRTRNR)を起動します。

同期点を取得する関数を呼び出さなかった場合

同期点を取得する関数を呼び出す前にUAPがTP1/EEに制御を戻した場合は,UAPの同期点の決着結果はコミットになります。同期点を取得する関数を呼び出す前にUAPが異常終了した場合は,UAPの同期点の決着結果はロールバックになります。

(b) リソースマネジャとのコネクションの解放

トランザクションの同期点処理が完了するときに,スレッドにリンクされているすべてのリソースマネジャに対してコネクションの解放要求(xa_close関数)を指示できます。スレッドにリンクされているすべてのリソースマネジャに対してコネクションの解放を指示するには,ee_trn_rm_close_mark関数【CBLEETRN('RMCLSMK ')】を呼び出します。同期点処理の完了時にコネクション確立済みのリソースマネジャが存在しない場合は,ee_trn_rm_close_mark関数を呼び出してもコネクションの解放要求(xa_close関数)を指示しません。

注※

同期点処理が完了する時点は,次に示す関数または処理が終了した時点を指します。

  • ee_trn_chained_commit関数

  • ee_trn_chained_rollback関数

  • UAPリターン後の同期点処理

リソースマネジャとのコネクションの再確立(xa_open関数)は,ee_trn_rm_close_mark関数を呼び出したスレッドでの次回のトランザクション開始時にTP1/EEが行います。

トランザクション関連定義のtrnstring定義コマンドで複数のOracleに接続するように定義した場合で,SQLの実行時にエラーが発生したときは,ee_trn_rm_close_mark関数を呼び出してリソースマネジャとのコネクションを解放してください。これは,SQL実行時のエラーが発生したあとやトランザクションをロールバックしたあとに,Oracleの暗黙カーソルをクローズさせるためです。Oracleの暗黙カーソルがクローズされない場合に,Oracleに対するSQLの実行でエラーが発生したあとで別のOracleに対してSQLを実行すると,SQLエラーが発生します。コネクションの解放を指示してOracleの暗黙カーソルをクローズすることで,以降のトランザクションでのSQLエラーを回避できます。

注意事項

トランザクションの同期点を取得する処理でエラーが起こった場合,コミット時に実行する次の関数の処理は無効となります。

  • ee_rpc_cmtsend関数【CBLEERPC('CMTSND ')】

  • ee_rpc_cmtsend_to関数【CBLEERPC('CMTSNDTO')】

  • ee_tim_execap関数【CBLEETIM('EXECAP ')】(acttypeにEETIM_COMT指定)

  • ee_mch_cmtsend関数【CBLEEMCH('CMTSND ')】(XTCを使用する場合)

  • ee_mch_cmtsend_sync関数【CBLEEMCH('CMTSNDSY')】(XTCを使用する場合)

  • ee_mcp_send関数【CBLEEMCP('SEND ')】(MCPを使用する場合)