トランザクションをロールバックとは、トランザクションによる変更をすべて取り消すことです。未コミットのトランザクション全体をロールバックすることも、トランザクション内の任意のセーブポイントまでロールバックすることもできます。
トランザクション全体のロールバック
トランザクションが未コミットの場合は、ROLLBACK ステートメントを使用してトランザクション全体をロールバックできます。
トランザクション全体をロールバックした後:
すべての変更は破棄されます。
すべてのセーブポイントはクリアされます。
トランザクションが保持しているすべてのロックが解除されます。
ステートメントの構文は以下のとおりです:
ROLLBACK;
以下の例では、ROLLBACK を使用して、現在のトランザクションのすべての変更をロールバックします。
obclient> SELECT * FROM ordr;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 03-NOV-22 |
| 2 | US | 10002 | 03-NOV-22 |
| 3 | EN | 10003 | 03-NOV-22 |
+----+------+-------+------------+
3 rows in set
obclient [SYS]> BEGIN;
Query OK, 0 rows affected
obclient [SYS]> INSERT INTO ordr(id, name, value) VALUES(4,'JP',10004);
Query OK, 1 row affected
obclient [SYS]> INSERT INTO ordr(id, name, value) VALUES(5,'FR',10005),(6,'RU',10006);
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
obclient [SYS]> SELECT * FROM ordr;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 03-NOV-22 |
| 2 | US | 10002 | 03-NOV-22 |
| 3 | EN | 10003 | 03-NOV-22 |
| 4 | JP | 10004 | 03-NOV-22 |
| 5 | FR | 10005 | 03-NOV-22 |
| 6 | RU | 10006 | 03-NOV-22 |
+----+------+-------+------------+
6 rows in set
obclient> ROLLBACK;
Query OK, 0 rows affected
obclient> SELECT * FROM ordr;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 03-NOV-22 |
| 2 | US | 10002 | 03-NOV-22 |
| 3 | EN | 10003 | 03-NOV-22 |
+----+------+-------+------------+
3 rows in set
本例では、BEGIN で明示的にトランザクションを開始します。COMMIT で明示的にトランザクションをコミットするまで、すべての変更は現在のセッションでのみ可視化され、変更は永続化されません。ROLLBACK ステートメントを使用してロールバックし変更することができます。
特定のセーブポイントへのロールバック
トランザクションにセーブポイントが設定されている場合、ROLLBACK TO SAVEPOINT ステートメントを使用して、特定のセーブポイントにロールバックできます。トランザクションのセーブポイントに関する説明は、トランザクションのセーブポイントを参照してください。
説明
DBLinkは SAVEPOINT 機能をサポートしており、トランザクションを指定したセーブポイントにロールバックすることを許可します。DBLinkに関する情報については、DBLinkを使用してリモートデータベースのデータを変更するを参照してください。
トランザクションを特定のセーブポイントまでロールバックした後:
*トランザクションは終了しません。
セーブポイント以前の変更は保持され、セーブポイント以降の変更は破棄されます。
指定したセーブポイント以降のセーブポイント(指定したセーブポイント自身は除く)はクリアされます。
セーブポイント以降に、トランザクションが保持していたすべてのロックが解除されます。
特定のセーブポイントにロールバックする構文は以下のとおりです:
ROLLBACK TO SAVEPOINT pointname;
ここで、pointname はトランザクションのセーブポイント名を表します。
トランザクションを特定のリストアポイントにロールバックする詳細な例と説明については、トランザクションを特定のセーブポイントにロールバックするを参照してください。