ROLLBACK
ROLLBACK ステートメントは、変更をバックアウトするために使用します。
ROLLBACK ステートメントは次の目的に使用できます。
- 作業単位を終了させ、その作業単位でリレーショナル・ データベースに対して行われたすべての変更をバックアウトする。 アプリケーション・プロセスが使用しているリカバリー可能リソースが リレーショナル・データベースだけである場合は、ROLLBACK は作業単位も 終了します。
- 作業単位を終了させずに、その作業単位内に設定されたセーブポイント 以降に行われた変更のみをバックアウトする。 セーブポイントまでのロールバックにより、選択した変更を取り消すことができます。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むことができ、また対話式に呼び出すこともできます。 これは、動的に準備できる実行可能ステートメントです。
トリガー・プログラムとその対象となるプログラムが同じコミットメント定 義のもとで実行される場合、トリガーでは ROLLBACK は許されません。 リモート・アプリケーション・サーバーへの分散作業単位接続時に呼び出されるプロシージャー、または ATOMIC として定義されているプロシージャーでは、ROLLBACK を使用することはできません。関数内では ROLLBACK を使用できません。
権限
権限は不要です。
構文
.-WORK-. >>-ROLLBACK--+------+--+-----------------------------------+--->< +-HOLD------------------------------+ '-TO -SAVEPOINT--+----------------+-' '-savepoint-name-'
説明
TO SAVEPOINT 文節なしの ROLLBACK を使用すると、このステートメントが 実行される作業単位が終了します。 作業単位の中で SQL スキーマ・ステートメントおよび SQL データ変更ステートメントにより行われたすべての変更がバックアウトされます。 詳しくは、ステートメントを参照してください。
識別値の生成は、トランザクションの制御下にありません。 識別列を持つ表への行の挿入によって生成され、消費される値は、ROLLBACK ステートメントの実行に依存しません。 また、ROLLBACK ステートメントの実行は、IDENTITY_VAL_LOCAL 関数に影響を与えません。
特殊レジスターは、トランザクションの制御下にありません。 ROLLBACK ステートメントの実行は、特殊レジスターに影響を与えません。
シーケンスは、トランザクションの制御下にありません。 ROLLBACK ステートメントの実行は、NEXT VALUE 式の実行によって生成され、消費される現行値に影響を与えません。
グローバル変数は、トランザクションの制御下にありません。ROLLBACK ステートメントの実行は、インスタンス化されたグローバル変数の値に影響を与えません。
宣言済み一時表の内容に対する ROLLBACK または ROLLBACK TO SAVEPOINT の影響は、DECLARE GLOBAL TEMPORARY TABLE ステートメントの ON ROLLBACK 文節の設定によって決まります。
- WORK
- ROLLBACK WORK と ROLLBACK の効果は同じです。
- HOLD
- リソースを保持するように指示します。
これを指定すると、現在オープンされているカーソルは、HOLD オプションで宣言されているかどうかに関係なく、クローズされません。
作業単位の過程で獲得したリソース (表の行に対するロックは除く) はすべて保持されます。ただし、その作業単位の過程で特定の行に対して暗黙に掛けられたロックは解放されます。
次のような条件が当てはまらない場合、ROLLBACK HOLD が終了したときのカーソル位置は 、該当する作業単位を開始したときと同じになります。
- カーソルを含むプログラムまたはルーチンの作成時に ALWBLK(*ALLREAD) が 指定された場合
- カーソルを含むプログラムまたはルーチンの作成時に ALWBLK(*READ) および ALWCPYDTA(*OPTIMIZE) が指定された場合
- TO SAVEPOINT
- 作業単位を終了せずに、部分ロールバック (セーブポイントまで) のみを行うことを指定します。
セーブポイント名を指定しなかった場合は、最後の活動セーブポイントまでのロールバックが行われます。
例えば、ある作業単位の中でセーブポイント A、B、および C がこの順序
で設定されているときに、C が解放されたとすると、ROLLBACK TO SAVEPOINT に
よりセーブポイント B までのロールバックが行われます。アクティブなセーブポイントが存在しない場合は、エラーが戻されます。
- savepoint-name
- どのセーブポイントまでロールバックするかを指定します。 この名前は、現行サーバーに存在しているセーブポイントを識別していなければなりません。
ROLLBACK TO SAVEPOINT が正常に完了した後も、セーブポイントは存続します。
セーブポイントが設定された後で行われたすべてのデータベース変更 (ON ROLLBACK PRESERVE ROWS 文節 によって宣言済みの一時表に対する変更も含む) がバックアウトされます。 ロックおよび LOB ロケーターはすべて保持されます。
ROLLBACK TO SAVEPOINT によるカーソルへの影響は、セーブポイントに含まれるステートメントによって決まります。
- セーブポイントに、カーソルが依存している SQL スキーマ・ステートメントが含まれている場合は、 そのカーソルはクローズされます。 ROLLBACK TO SAVEPOINT の後でこのようなカーソルを使用しようとすると、エラーが起こります。
- その他の場合は、カーソルは ROLLBACK TO SAVEPOINT の影響を受け ません (オープンされ、位置付けされたままの状態を維持します)。
ロールバックの対象となったセーブポイントより後で設定された、現行サーバー上のセーブポイントは、すべて解放されます。 ロールバックの対象となったセーブポイントは解放されません。
注
推奨されるコーディング方法: 明示的な COMMIT または ROLLBACK ステートメントを、アプリケーション・プロセスの最後にコーディングしてください。 アプリケーション環境に応じて、暗黙的なコミットまたはロールバック操作のいずれかが、 アプリケーション・プロセスの終わりに実行されます。 このため、移植可能なアプリケーションでは、 明示的な COMMIT または ROLLBACK が許可された環境で実行が終了する前に、COMMIT または ROLLBACK を明示的に実行する必要があります。
ロールバックによるその他の影響: TO SAVEPOINT 文節および HOLD 文節を指定せずにロールバックすると、次が発生します。
- 作業単位の実行中にオープンされたすべてのカーソルは、HOLD オプションによって宣言されているかどうかに関係なくクローズされます。
- すべての LOB ロケーター (保持されているものも含む) が解放されます。
- この作業単位のコミットメント定義のもとで獲得されたロックはすべて、解放されます。
ROLLBACK は、接続の状態に影響を与えません。
暗黙的なロールバック: デフォルトの活動化グループが終了すると、 暗黙のロールバックが行われます。 したがって、明示的な COMMIT または ROLLBACK ステートメントは、 デフォルトの活動化グループが終了する前に出しておかなければなりません。
次のような場合は、ROLLBACK が自動的に実行されます。
- デフォルトの活動化グループが最後に COMMIT を出さずに終了した場合。
- 活動化グループの作業の完了を妨げるような障害 (例えば、電源障害など) が発生した場合。
障害が起こった時点で COMMIT が進行中であったためにその作業単位が準備状態である場合、ロールバックは行われません。 代わりに、その作業単位に関連するすべての接続の再同期化が行われます。 詳しくは、「コミットメント制御」トピック集を参照してください。
- アプリケーション・サーバーとの接続が失われるような障害 (例えば、通信回線の障害など) が発生した場合。
障害が起こった時点で COMMIT が進行中であったためにその作業単位が準備状態である場合、ロールバックは行われません。 代わりに、その作業単位に関連するすべての接続の再同期化が行われます。 詳しくは、「コミットメント制御」トピック集を参照してください。
- デフォルトの活動化グループ以外の活動化グループは、異常終了します。
影響されないステートメント: コミットおよびロールバック操作が DROP SCHEMA ステートメントに 影響することはありません。したがって、このステートメントは、現行の分離レベルがコミット不可 (NC) の場合に使用できます。
ROLLBACK の制約事項: 対象の活動化グループについてコミットメント制御が活動状態にない場合 は、ROLLBACK ステートメントは使用できません。 どのコミットメント定義が使用されているかを判別する方法については、COMMIT ステートメントの項のコミットメント定義に関する説明を参照してください。
2 次スレッドのユーザー定義関数でコミットまたはロールバックは使用できません。
ROLLBACK は、接続の状態に影響を与えません。
1 つの作業単位の中で、CLOSE の後に ROLLBACK を実行すると、 その作業単位の中で行われた変更はすべてバックアウトされます。 ただし、CLOSE 自体はバックアウトされないので、ファイルが再オープンされることはありません。
例
例 1: ROLLBACK ステートメントを使用した例については、例の COMMIT の項を参照してください。
例 2: あるリカバリー単位の開始後に、A、B、C の 3 つのセーブポイントが設定 され、その後 C が解放されたとします。
SAVEPOINT A ON ROLLBACK RETAIN CURSORS;
...
SAVEPOINT B ON ROLLBACK RETAIN CURSORS;
....
SAVEPOINT C ON ROLLBACK RETAIN CURSORS;
...
RELEASE SAVEPOINT C
セーブポイント A までのデータベース変更のみをすべてロールバックします。
ROLLBACK WORK TO SAVEPOINT A
セーブポイント名が指定されていない場合 (つまり ROLLBACK WORK TO SAVEPOINT の場合)、最後に設定されたアクティブ・セーブポイント (B) までのロールバックが行われます。
- 高水準言語のファイル処理機能によるコミットメント制御のもとでオー プンされたファイルに基づいてアクセスまたは変更された行。
- トリガー、または CASCADE、SET NULL、あるいは SET DEFAULT 参照保全削除規則の結果として削除、更新、または挿入された行。