独立したトランザクション
SQL スクリプトの独立したトランザクションは、メイントランザクションに何が起こったかに関係なく、それ自体でロールバックまたはコミットできる一連の作業です。
構文
INDEPENDENT [<option> …] TRANSACTION
備考
| • | オプション (<option> ...) は大文字と小文字を区別しません。 |
| • | 次の表では、独立したトランザクションのオプション フラグについて説明します。 |
|
オプションフラグ |
重要性 |
|||||||||
|
ROLLBACK_ON_FAILURE | |
このフラグのペアは、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 |
このフラグのグループは、サーバーがダウンした場合、またはトランザクションのコミットが部分的に完了したときに中断された場合に、システムが何をすべきかを示します。これらのフラグを一度に複数設定することはできません。
|
| • | 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 つの相互に排他的なオプションが宣言されています。 |