本記事では、トランザクションのロールバック操作について説明します。
トランザクションをロールバックとは、トランザクションによる変更をすべて取り消すことです。未コミットのトランザクション全体をロールバックすることも、トランザクション内の任意のセーブポイントまでロールバックすることも可能です。
トランザクション全体のロールバック
トランザクションがコミットされていない場合は、ROLLBACK ステートメントを使用してトランザクション全体をロールバックできます。
トランザクション全体をロールバックした後:
すべての変更は破棄されます。
すべてのセーブポイントはクリアされます。
トランザクションが保持しているすべてのロックが解除されます。
トランザクション全体をロールバックする構文は以下のとおりです:
ROLLBACK;
以下の例では、ROLLBACK を使用して、現在のトランザクションのすべての変更をロールバックします。
obclient [test]> SELECT * FROM ordr;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2022-10-19 14:51:12 |
| 2 | US | 10002 | 2022-10-19 14:51:12 |
| 3 | EN | 10003 | 2022-10-19 14:51:12 |
| 4 | JP | NULL | 2022-10-19 14:51:44 |
| 5 | CN | NULL | 2022-10-19 14:53:56 |
+----+------+-------+---------------------+
5 rows in set
obclient [test]> BEGIN;
Query OK, 0 rows affected
obclient [test]> INSERT INTO ordr(id, name, value) VALUES(6,'JP',10007);
Query OK, 1 row affected
obclient [test]> INSERT INTO ordr(id, name, value) VALUES(8,'FR',10008),(9,'RU',10009);
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
obclient [test]> SELECT * FROM ordr;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2022-10-19 14:51:12 |
| 2 | US | 10002 | 2022-10-19 14:51:12 |
| 3 | EN | 1003 | 2022-10-19 14:51:12 |
| 4 | JP | NULL | 2022-10-19 14:51:44 |
| 5 | CN | NULL | 2022-10-19 14:53:56 |
| 6 | JP | 10007 | 2022-10-19 14:58:24 |
| 8 | FR | 10008 | 2022-10-19 14:58:35 |
| 9 | RU | 10009 | 2022-10-19 14:58:35 |
+----+------+-------+---------------------+
8 rows in set
obclient [test]> ROLLBACK;
Query OK, 0 rows affected
obclient [test]> SELECT * FROM ordr;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2022-10-19 14:51:12 |
| 2 | US | 10002 | 2022-10-19 14:51:12 |
| 3 | EN | 1003 | 2022-10-19 14:51:12 |
| 4 | JP | NULL | 2022-10-19 14:51:44 |
| 5 | CN | NULL | 2022-10-19 14:53:56 |
+----+------+-------+---------------------+
5 rows in set
この例では、BEGIN で明示的にトランザクションを開始します。COMMIT で明示的にトランザクションをコミットするまで、すべての変更は現在のセッションでのみ可視化され、変更は永続化されません。ROLLBACK ステートメントを使用してロールバックし、変更を元に戻すことができます。
トランザクションを特定のセーブポイントまでロールバック
トランザクションにセーブポイントが設定されている場合、ROLLBACK TO SAVEPOINT ステートメントを使用して、特定のセーブポイントまでロールバックできます。トランザクションのセーブポイントに関する説明は、トランザクションのセーブポイントを参照してください。
特定のセーブポイントまでロールバックした後:
トランザクションは終了しません。
セーブポイント以前の変更は保持され、セーブポイント以降の変更は破棄されます。
指定したセーブポイント以降のセーブポイント(指定したセーブポイント自身は除く)はクリアされます。
セーブポイント以降にトランザクションが保持していたすべてのロックが解除されます。
特定のセーブポイントまでロールバックする構文は以下のとおりです:
ROLLBACK TO SAVEPOINT pointname;
ここで、pointname はトランザクションのセーブポイント名を表します。
トランザクションを特定の復元ポイントまでロールバックする詳細な例と説明については、トランザクションを特定のセーブポイントまでロールバックするを参照してください。