Hitachi

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


2.3.2 同期点の取得

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

〈この項の構成〉

(1) コミットの関数の呼び出し

UAPからコミットを指示する関数は,ルートトランザクションブランチ(dc_trn_begin関数でトランザクションを開始したSPPまたはSUP)からだけ使えます。ルートトランザクションブランチ以外のトランザクションブランチでは,コミットの関数は使えません。グローバルトランザクションは,すべてのトランザクションブランチが正常に終了したことで正常終了となります。

(a) 連鎖/非連鎖モードのコミット

トランザクション処理の同期点を取得する関数には,一つのトランザクションの終了後,同期点を取得して次のトランザクションを続けて起動する連鎖モードのコミットdc_trn_chained_commit関数)と,トランザクションの終了で同期点を取得したあとに,新たなトランザクションを起動しない非連鎖モードのコミットdc_trn_unchained_commit関数)があります。

トランザクションの連鎖/非連鎖モードを次の図に示します。

図2‒28 トランザクションの連鎖/非連鎖モード

[図データ]

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

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

(a) 連鎖/非連鎖モードのロールバック

ロールバックの関数には,連鎖モードのロールバックdc_trn_chained_rollback関数)と非連鎖モードのロールバックdc_trn_unchained_rollback関数)があります。連鎖モードのロールバックの場合は,ロールバック処理後も新しいグローバルトランザクションの範囲にあります。非連鎖モードのロールバックをルートトランザクションブランチから呼び出した場合は,グローバルトランザクションの範囲にはありません。

連鎖モードのロールバックは,ルートトランザクションブランチからしか呼び出せません。非連鎖モードのロールバックは,どのトランザクションブランチからでも呼び出せます。

ルート以外のトランザクションブランチから非連鎖モードのロールバックを呼び出した場合は,そのトランザクションブランチがロールバック対象である(rollback_only状態)ことをルートトランザクションブランチに通知します。この場合,ロールバック関数のあとから,dc_rpc_call関数がリターンするまでの処理もグローバルトランザクションの範囲にあります。

トランザクションのロールバックを次の図に示します。

図2‒29 トランザクションのロールバック

[図データ]

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

トランザクションの同期点を取得する処理でエラーが起こった場合,そのトランザクションが同期点の1相目まで完了していればコミットして,1相目まで完了していなければロールバックします。グローバルトランザクション内のどれか一つのトランザクションブランチがロールバックになった場合は,グローバルトランザクション全体がロールバックになります。

同期点を取得する処理でエラーが起こった場合のロールバックを次の図に示します。

図2‒30 同期点を取得する処理でエラーが起こった場合のロールバック

[図データ]

(4) 同期点を取得する関数を呼び出さなかった場合の処理

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

同期点を取得する関数を呼び出さないで,ルートトランザクションブランチのUAPがexit()した場合は,OpenTP1が自動的にコミットの処理をします。そのコミット処理で1相目が完了する前にエラーが起こった場合は,グローバルトランザクションはロールバックされます。この場合,UAPには通知できません。