リファレンスガイド> TDV SQLスクリプト> SQLスクリプトの手順と構造> 補償トランザクション
 
補償トランザクション
SQLスクリプトの補正トランザクションは、複合ステートメントの終了後にトランザクションの整合性を復元するためにCOMPENSATE例外が呼び出す特別なハンドラーです。
備考
COMPENSATE例外のハンドラーが存在すると、実行時に特別な動作が発生します。他の例外とは異なり、この例外はELSE句では処理できません。明示的にのみ処理できます。
COMPENSATE例外は、複合ステートメントの終了後に発生する可能性がある唯一の例外であるため、特別です。ステートメントが終了してから長い時間がかかる場合があります。この例外は、トランザクションがトランザクションのコントローラーによって明示的にロールバックされた場合、またはコミット中に障害が発生した場合にシステムによってロールバックされた場合に発生します。
COMPENSATEハンドラーは、他の例外ハンドラーと同様に、ブロックが参照できるすべての変数にアクセスできます。これは、ブロックが終了したときのこれらの変数のコピーです。
ブロックの実行ごとに可変状態のこの追加のストレージを保持する必要があるため、補償にはコストがかかる可能性があります。たとえば、ブロックが1,000回実行されたループで発生した場合、1,000の個別の補償状態を実行する必要があります。このため、COMPENSATEハンドラーを注意深く監視してください。
現在のローカルデータの状態のみがハンドラーに保持されます。グローバルシステムの状態は保持されません。つまり、別のプロシージャを呼び出す場合、このブロックが最初に実行されたときと同じ状態にすることはできません。このため、COMPENSATEハンドラーで使用できるように、変数への通常の実行中に必要な状態をキャプチャーする必要があります。
PROCEDURE p ( )
BEGIN INDEPENDENT TRANSACTION
  <statement>
END
 
以下の例では、挿入は自動的にコミットされます。
PROCEDURE p ( )
BEGIN INDEPENDENT TRANSACTION
  INSERT INTO /shared/T (name, score) VALUES ('Joe”, 123);
END
 
以下の例では、インサートは自動的にロールバックされます。
PROCEDURE p ( )
BEGIN INDEPENDENT TRANSACTION
  DECLARE my_exc EXCEPTION;
  INSERT INTO /shared/T (name, score) VALUES ('Joe”, 123);
  RAISE my_exec;
END
 
以下の例では、挿入は自動的にコミットされます。
PROCEDURE p ( )
BEGIN INDEPENDENT TRANSACTION
  DECLARE my_exc EXCEPTION;
  INSERT INTO /shared/T (name, score) VALUES ('Joe”, 123);
  RAISE my_exec;
  EXCEPTION
    ELSE
END