2.3.2 同期点の取得
グローバルトランザクションを構成するトランザクションブランチのすべてを,同期を取って同じ決着結果(コミットまたはロールバック)で終了させることを同期点の取得といいます。
(1) コミットの関数の呼び出し
UAPからコミットを指示する関数は,ルートトランザクションブランチ(dc_trn_begin関数でトランザクションを開始したSPPまたはSUP)からだけ使えます。ルートトランザクションブランチ以外のトランザクションブランチでは,コミットの関数は使えません。グローバルトランザクションは,すべてのトランザクションブランチが正常に終了したことで正常終了となります。
(2) ロールバックの関数の呼び出し
トランザクションをUAPの判断でロールバックとしたいときは,UAPからロールバックを要求できます。
(a) 連鎖/非連鎖モードのロールバック
ロールバックの関数には,連鎖モードのロールバック(dc_trn_chained_rollback関数)と非連鎖モードのロールバック(dc_trn_unchained_rollback関数)があります。連鎖モードのロールバックの場合は,ロールバック処理後も新しいグローバルトランザクションの範囲にあります。非連鎖モードのロールバックをルートトランザクションブランチから呼び出した場合は,グローバルトランザクションの範囲にはありません。
連鎖モードのロールバックは,ルートトランザクションブランチからしか呼び出せません。非連鎖モードのロールバックは,どのトランザクションブランチからでも呼び出せます。
ルート以外のトランザクションブランチから非連鎖モードのロールバックを呼び出した場合は,そのトランザクションブランチがロールバック対象である(rollback_only状態)ことをルートトランザクションブランチに通知します。この場合,ロールバック関数のあとから,dc_rpc_call関数がリターンするまでの処理もグローバルトランザクションの範囲にあります。
トランザクションのロールバックを次の図に示します。
|
(3) 同期点を取得する処理でエラーが起こった場合
トランザクションの同期点を取得する処理でエラーが起こった場合,そのトランザクションが同期点の1相目まで完了していればコミットして,1相目まで完了していなければロールバックします。グローバルトランザクション内のどれか一つのトランザクションブランチがロールバックになった場合は,グローバルトランザクション全体がロールバックになります。
同期点を取得する処理でエラーが起こった場合のロールバックを次の図に示します。
|
(4) 同期点を取得する関数を呼び出さなかった場合の処理
同期点を取得する関数を呼び出す前にUAPが異常終了した場合は,UAPの同期点の決着結果はロールバックになります。
同期点を取得する関数を呼び出さないで,ルートトランザクションブランチのUAPがexit()した場合は,OpenTP1が自動的にコミットの処理をします。そのコミット処理で1相目が完了する前にエラーが起こった場合は,グローバルトランザクションはロールバックされます。この場合,UAPには通知できません。