ROLLBACK ステートメント
ROLLBACK ステートメントを使用すると、リカバリー単位を終了させ、そのリカバリー単位によって行われたリレーショナル・データベースの変更をすべてバックアウトできます。 アプリケーション・プロセスで使用しているリカバリー可能リソースがリレーショナル・データベースのみであれば、ROLLBACK によって作業単位も終了します。 ROLLBACK を使用すると、リカバリー単位を終了せずに、リカバリー単位内にセーブポイントが設定された後に行われた変更のみをバックアウトすることもできます。 セーブポイントまでロールバックすることによって、選択した変更を取り消すことができます。
呼びかけ ROLLBACK
このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 このステートメントは、動的に作成できる実行可能ステートメントです。 TO SAVEPOINT句が指定されている場合のみ、 IMS または CICS® 環境で使用できます。
承認 ROLLBACK
不要です。
構文 ROLLBACK
説明の対象: ROLLBACK
SAVEPOINT 文節なしで ROLLBACK を使用した場合、ROLLBACK ステートメント が実行されたリカバリー単位は終了し、新しいリカバリー単位が始まります。
リカバリー単位の間に以下のステートメントによって行われた変更はすべてバックアウトされます。
- ALTER
- COMMENT
- CREATE
- DELETE
- DROP
- EXPLAIN
- GRANT
- INSERT
- ラベル
- MERGE
- REFRESH TABLE
- RENAME
- REVOKE
- SQL データ変更ステートメント付きの SELECT INTO
- SQL データ変更ステートメント付きの SELECT ステートメント
- IMMEDIATE 文節を指定しない場合の TRUNCATE
- UPDATE
TO SAVEPOINT 文節なしで ROLLBACK を使用した場合には、以下の処置が行われます。
- リカバリー単位の間に暗黙的に獲得されたロックは、すべて解除されます。 明示的に取得したロックの持続時間については、LOCK TABLE 文を参照してください。
- カーソルはすべてクローズされ、準備済みステートメントもすべて破棄されます。 準備済みステートメントに関連付けられているカーソルは無効となります。
- アプリケーション・プロセスのすべての作成済みの一時表の行と論理作業ファイルがすべて削除されます。 (宣言済み一時表のすべての行は暗黙的に削除されません。 基本表と同様に、リカバリー単位の間に宣言済み一時表に対して行われたすべての変更は取り消され、最後のコミット・ポイントの 状態に表がリストアされます。)
- 保留されているものも含めて、すべての LOB ロケーターが解放されます。
- TO SAVEPOINT
- リカバリー単位が終了されず、(セーブポイントへの) 一部のロールバックが行われることを指定します。 セーブポイント名が指定されていない場合、
最後にアクティブだったセーブポイントへロールバックが行われます。 例えば、
リカバリー単位にセーブポイント A、B、C がその順番で設定されていて、C が
解放された場合には、ROLLBACK TO SAVEPOINT によってセーブポイント B へロールバックされます。
- セーブポイント名
- ロールバック先のセーブポイントを指定します。 この名前は、現行サーバーに存在するセーブポイントを示すものでなければなりません。
セーブポイントの設定後に行われたすべてのデータベース変更 (宣言済み一時表に対して行われた変更を含みますが、作成済みの一時表への変更は除外します) がバックアウトされます。 作成済みの一時表に対して行われる変更はログに記録されないため、バックアウトされません。代わりに警告が出されます。 (作成済みの一時表が変更され、アクティブなセーブポイントがある場合にも警告が出されます。)
また、以下の項目はいずれもバックアウトされません。
- カーソルのオープンまたはクローズ
- カーソル位置の変更
- ロックの獲得と解放
- ロールバックされたステートメントのキャッシュ
ロールバックが実行されるセーブポイントの後に設定されているセーブポイントはすべて解放されます。 ロールバックの実行先となるセーブポイントは解放されません。
ROLLBACK (TO SAVEPOINT 文節付き、またはなし) は接続には何の影響も持ちません。
注釈 ROLLBACK
以下の情報は、リカバリー単位内のすべての変更のロールバックに 適用されます (ROLLBACK ステートメント (TO SAVEPOINT 文節なし))。
- ストアード・プロシージャー。 ROLLBACK文は、プロシージャがユーザー定義関数またはトリガの呼び出しチェーンにある場合、または Db2 がコミットコーディネータでない場合は使用できません。
- IMS または。 CICS IMS または 環境でROLLBACK TO SAVEPOINTステートメントを使用すると、 リソースのみがロールバックされます。 CICS Db2 その環境で更新されたリカバリー可能リソースはロールバックされません。 これらの環境でロールバック操作を行うためには、SQL プログラムはトランザクション・マネージャーによって規定された呼び出しを使う必要があります。 Db2 データに対するこれらのロールバック操作の効果は、SQL ROLLBACK文と同じです。
IMS または CICS 環境におけるロールバック操作では、WITHホールドオプションで宣言されたカーソルのクローズが、SQL ROLLBACKステートメントとは異なる方法で処理される可能性があります。 アプリケーションが CICS または IMS にロールバック操作を要求しているが、最後のコミットポイント以降、 Db2 で作業が行われていない場合、ロールバック要求は Db2 にブロードキャストされません。 以前の作業単位で、 アプリケーションが WITH HOLD オプションを使用して カーソルをオープンしてある場合、カーソルはクローズされず、 これらのカーソルと関連したすべての準備済みステートメントは 破棄されません。
- 暗黙のロールバック操作 :すべての Db2 環境において、プロセスの異常終了は暗黙のロールバック操作です。
ROLLBACK とログに記録されない非 LOB 表スペース: ログに記録されない (NOT LOGGED 属性を指定) 非 LOB 表スペースへの変更を含む作業単位に ROLLBACK が実行されると、その表スペースには RECOVER ペンディングのマークが付けられ、その表スペースは論理ページ・リストに置かれます。 このため、ロールバック操作が完了した後も、この表スペースは使用できません。 RECOVERユーティリティの詳細については、RECOVER を参照してください。
ログに記録されていないグローバル一時テーブルのROLLBACKと宣言:宣言されたグローバル一時テーブルでNOT LOGGEDが指定されている場合、 Db2 は、重複キーエラーなどのエラーによりロールバックする必要があります。行は、ON ROLLBACKで指定されたオプションに応じて削除または保持されます。
表に ON ROLLBACK DELETE ROWS オプションを指定した場合、挿入、更新、および削除アクティビティーはログに記録されません。 ROLLBACK または ROLLBACK TO SAVEPOINT の操作中に、最後の COMMIT ステートメント以降に表が更新された場合は、表からすべての行が削除されます。 表のオープン・カーソルの位置はありません。 宣言済みグローバル一時表の宣言がコミットされなかった場合は、この表の宣言はロールバックされます。
表に ON ROLLBACK PRESERVE ROWS オプションを指定した場合、挿入、更新、および削除アクティビティーはログに記録されません。 ROLLBACK または ROLLBACK TO SAVEPOINT の操作中には、最後の COMMIT ステートメント以降の表に対する更新には関係なく、表内のすべての行が保存されます。 表のオープン・カーソルの位置はありません。 宣言済みグローバル一時表の宣言がコミットされなかった場合は、この表の宣言はロールバックされます。
グローバル変数に対する ROLLBACK の影響: グローバル変数はトランザクション・レベルで制御されません。 ROLLBACK ステートメント発行しても、グローバル変数の内容には影響しません。
挿入操作での ROLLBACK の影響: INSERT ステートメントの実行の結果として表スペースにデータ・セットが作成された後、INSERT 操作がロールバックされると、挿入されたデータは削除されますが、データ・セットは削除されません。
準備された動的ステートメントに対する ROLLBACK の影響: KEEPDYNAMIC(YES) でバインドされたパッケージ内のすべての準備された動的ステートメントは、ロールバック ポイントを過ぎても保持されます。
例 ROLLBACK
ROLLBACK WORK; ...
SAVEPOINT A ON ROLLBACK RETAIN CURSORS;
...
SAVEPOINT B ON ROLLBACK RETAIN CURSORS;
...
SAVEPOINT C ON ROLLBACK RETAIN CURSORS;
...
RELEASE SAVEPOINT C;
... Db2 データベースの変更をすべてロールバックして、保存ポイントAのみに保存します ROLLBACK WORK TO SAVEPOINT A;セーブポイント名が指定されていない場合 (つまり、ROLLBACK WORK TO SAVEPOINT)、最後に設定されたアクティブなセーブポイント (つまり、B) までロールバックが行われます。