独立したトランザクション

SQL スクリプトの独立したトランザクションは、メイントランザクションに何が起こったかに関係なく、それ自体でロールバックまたはコミットできる一連の作業です。

構文

INDEPENDENT [<option> …] TRANSACTION  

備考

オプション (<option> ...) は大文字と小文字を区別しません。
次の表では、独立したトランザクションのオプション フラグについて説明します。

オプションフラグ

重要性

ROLLBACK_ON_FAILURE |
BEST_EFFORT

このフラグのペアは、COMMIT 中に障害が発生した場合 (デフォルトの ROLLBACK_ON_FAILURE) にトランザクションをロールバックする必要があるかどうか (BEST_EFFORT) を示します。これらのフラグの両方を同時に設定することはできません。

ROLLBACK_ON_FAILURE を使用すると、トランザクションのいずれかの部分のコミットに失敗すると、コミットされていない部分が破棄され、すでにコミットされている部分が補償されます (COMPENSATE/NOCOMPENSATE オプションに従って)。

BEST_EFFORT を使用すると、トランザクションの一部をコミットできない場合でも、可能な限り多くの他の部分がコミットされます。故障した部品はログに記録されます。

COMPENSATE | NOCOMPENSATE

このフラグのペアは、トランザクションがロールバックした場合 (COMPENSATE、デフォルト) に補償ブロックを実行する必要があるかどうか (NOCOMPENSATE) を示します。これらのフラグの両方を同時に設定することはできません。

NOCOMPENSATE は、補償のリスクを冒してパフォーマンスを向上させます。ただし、これを COMPENSATE に設定しても、補償ブロックを定義しない限り、パフォーマンス コストは発生しません。

IGNORE_INTERRUPT |

LOG_INTERRUPT |

FAIL_INTERRUPT

このフラグのグループは、サーバーがダウンした場合、またはトランザクションのコミットが部分的に完了したときに中断された場合に、システムが何をすべきかを示します。これらのフラグを一度に複数設定することはできません。

IGNORE_INTERRUPT (デフォルト) を指定すると、サーバーは再起動時に特別なアクションを実行しません。
LOG_INTERRUPT を使用すると、サーバーはコミットを開始する前に基本的なトランザクション情報を保存し、再起動時に進行中のトランザクションを検出して失敗をログに記録できるようにします。このオプションでは、トランザクションごとに 2 つのメタコミット (開始と停止) が必要です。
FAIL_INTERRUPT により、サーバーは、進行中のトランザクションに対してサーバーの起動時に要求された障害モデルを実行するのに十分な情報を格納します。このオプションは、トランザクションの開始時、トランザクションの終了時、およびコミット先のソースの各ペア間でメタコミットを要求するため、コストがかかります。
BEGIN ステートメントの後にトランザクション指定子を続けることができます。(複合ステートメントで BEGIN を使用する方法については、「複合ステートメント」を参照してください。) 指定子がない場合、ブロックはその親のトランザクション内で実行され、ブロックが実行するすべての作業は親トランザクションの一部になります。
複合ステートメントが独立したトランザクションを持つものとして宣言されると、そのスコープ内のすべてのアクションがトランザクションの一部になります。複合ステートメントの宣言については、「複合ステートメント」を参照してください。
COMMIT を呼び出すことをお勧めしますが、必須ではありません。「COMMIT」を参照してください。
スコープからの通常の終了により、トランザクションがコミットされます。
未処理の例外によってスコープを終了すると、トランザクション ロールバックが発生します。
処理された例外を終了しても、トランザクションが暗黙的にロールバックされることはありません。必要な場合は、トランザクションを明示的にロールバックする必要があります。「ROLLBACK」を参照してください。

SQL スクリプトでは、次のように BEST_EFFORT および NOCOMPENSATE オプションを使用できます。

PROCEDURE myProcedure ( ) 
BEGIN INDEPENDENT BEST_EFFORT NOCOMPENSATE TRANSACTION  
	-- Add your code here
END

エラー

次の表は、トランザクションの解決中に発生する可能性のあるエラーについて説明しています。

エラー メッセージ

原因

Conflicting options (競合するオプション)

2 つの相互に排他的なオプションが宣言されています。