ロールバック、ROLLBACK
ロールバックの仕組み:ロールバックとは、暗黙的なセーブポイント(※1)、または、明示的なセーブポイントまで変更した内容を取り消すこと。
⇔ コミット
(※1) トランザクションレベルとステートメントレベルにも設置される。但し、ステートメントレベルはユーザーからアクセスできない。
文レベルのロールバック
文レベルのロールバック(ステートメントレベル ロールバック)とは SQL コマンドやデッドロックによる
単文におけるエラーの取り消しのこと。
ロールバックされる範囲はステートメントレベルのセーブポイントが使用され、エラーの発生したステートメントが更新した範囲だけになる。
トランザクションのロールバック
トランザクションの開始時、または、明示的に設置したセーブポイントまでの取り消しのこと。
通常は複数のステートメントに渡って更新した範囲の変更処理を取り消す。
ロールバック時に行なう仕事は以下のとおり
- トランザクション開始時、また、指定したセーブポイントまでに変更されたデータを UNDO セグメント(ロールバックセグメント)から取り出す
- 取り出したデータを使って元のデータに書き換える。⇒ データに変動があったときの処理と同じ
- (セーブポイント指定時)セーブポイントより以後のセーブポイントをクリア
- ロールバックの対象となった操作による行レベルのロックと表レベルのロックの解放(※2)
- (セーブポイント指定時)トランザクション継続
(セーブポイント省略時)トランザクション終了
(※2) マニュアルによると行ロックが解除されない場合もある。
セッションが待機中の場合は、トランザクションをセーブポイントまでロールバックした場合
でも行のロックは解放されません。
遅延ロールバックセグメント 〜 ロールバックの遅延処理
ロールバックは UNDOセグメント(ロールバックセグメント)から過去のバージョンのデータを読み込み、データセグメントに対してデータを復旧する処理である。
しかし、ロールバックするときに該当するデータセグメントの表領域が使用不可能(オフライン時など)のときにはデータベースライタがデータファイルにアクセスできない。このときにロールバックするためのデータを UNDO セグメントからシステム表領域に「遅延ロールバックセグメント」として移動して UNDO 領域を解放することで UNDO を占有しない仕組みになっている。
上記以外のロールバック
以下の場合には Oracle のバッググランドプロセスによってロールバックが発生する。
リカバリによるロールバック
データに変動があったときの処理
データを挿入、更新、削除した場合に行なう仕事は以下のとおり。
- UNDO の生成(ロールバックセグメントレコード)
- REDO ログエントリの生成(REDO バッファ)
- データベース・バッファに対する変更(※3)
(※3) ダイレクトパスインサート はデータベースバッファを経由しない。
データベース・バッファを超過する処理量の場合にはトランザクションが未コミット状態でもデータファイルに書き込まれる。
参考:遅延ブロッククリーンアウト
関連事項