本記事では、トランザクションのロールバック操作について説明します。
トランザクションのロールバックとは、トランザクションの変更をすべて取り消すことです。未コミットのトランザクション全体をロールバックすることも、トランザクション内の任意のセーブポイントまでロールバックすることもできます。
トランザクション全体のロールバック
トランザクションが未コミットの場合は、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 はトランザクションのセーブポイント名を表します。
トランザクションを任意のリストアポイントまでロールバックする例と説明の詳細については、トランザクションを任意のセーブポイントまでロールバックするを参照してください。