OracleDatabaseの「rollback」文について紹介します。
「rollback」文は、「commit」文と同様にDCL(Data Control Language)と呼ばれ、
データを制御するSQL文になります。
この記事ではrollback時にOracle Database特有のイベントについても説明していきます。
なおcommit文の記事は以下にまとめてあります。
基本構文:commit
rollbackの基本構文は以下になります。
rollback;
上記のように何も指定しないとrollback文で以下の処理が行われます。
- トランザクションの終了
- 現行のトランザクションのすべての変更を取消し
- トランザクション中のセーブポイントの消去
- すべてのロックの解除
rollbackのオプションとして「savepoint」が存在します。
rollback to savepoint <セーブポイント名>; savepoint付きでrollback文を発行するとで以下の処理が行われます。
- トランザクションのセーブポイントまでロールバック。トランザクションは終了しない
- 指定したセーブポイントより後に作成されたセーブポイントの消去
- 指定したセーブポイントより後に発生した表・行へのロック解除
ロールバック(rollback)の種類
ここからはロールバックの種類とその特徴を紹介します。
トランザクションのrollback
トランザクションの開始時または設定したsavepointまでデータを元に戻すことを「トランザクションのロールバック」と呼びます。
- トランザクション開始時または指定したsavepointまでに変更されたデータをUNDOセグメントから取り出す
- 取り出したデータを使って元のデータを元に戻す
- ロールバックの対象となった操作による行レベルのロックと表レベルのロックの解放
- トランザクション終了 ※ savepointを指定した場合、トランザクションは終了しない
ステートメントレベルのrollback
SQL文やデッドロックによる 単文におけるエラーの取り消しを「ステートメントレベルロールバック」と呼びます。
ステートメントレベルのロールバックを使用するためには、「savapoint」を設定する必要があります。
ユーザープロセスの異常終了のロールバック
ユーザープロセスが何らかの原因で異常終了して時に、未コミットトランザクションが残ってしまう時があります。
このトランザクションをOracleDatabaseでは自動でロールバックします。
このロールバック処理はバックグラウンドのPMON(プロセス・モニター)プロセスが実施します。
クラッシュリカバリやメディアリカバリ処理
何らかの原因でインスタンスが異常終了した際にデータファイルが破損したりした時に、
OracleDatabaseが自動で行うロールバック処理が行います。
これらのロールバック処理はバックグラウンドのSMON(システム・モニター)プロセスが実施します。
Oracleの基本 ~データベース入門から設計/運用の初歩までposted with ヨメレバ
渡部 亮太,相川 潔,日比野 峻佑,岡野 平八郎,宮川 大地 技術評論社 2017-09-22