セーブポイントを設定した後、ROLLBACK TO SAVEPOINT ステートメントを使用して、指定したトランザクションのセーブポイントまでロールバックできます。
前提条件
セーブポイントが設定されていることを確認してください。具体的な操作については、セーブポイントの設定を参照してください。
トランザクションをセーブポイントまでロールバック
以下のステートメントを使用して、トランザクションを特定のセーブポイントまでロールバックできます。
ROLLBACK TO SAVEPOINT pointname;
ここで、pointname はトランザクションのセーブポイント名を表します。
以下の例では、1つのトランザクション内に複数のDMLステートメントと複数のセーブポイントを含みます。その後、そのうちの1つのセーブポイントまでロールバックすることで、セーブポイント以降の変更のみが破棄されることを示しています。
テーブルの現在のレコードを確認します。
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]> SET SESSION autocommit=0; Query OK, 0 rows affected obclient [test]> BEGIN; Query OK, 0 rows affected obclient [test]> INSERT INTO ordr(id, name) VALUES(6,'FR'); Query OK, 1 row affected obclient [test]> SAVEPOINT fr; Query OK, 0 rows affected obclient [test]> INSERT INTO ordr(id, name) VALUES(7,'RU'); Query OK, 1 row affected obclient [test]> SAVEPOINT ru; Query OK, 0 rows affected obclient [test]> INSERT INTO ordr(id, name) VALUES(8,'CA'); Query OK, 1 row affected obclient [test]> SAVEPOINT ca; 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 | | 6 | FR | NULL | 2022-10-19 15:01:39 | | 7 | RU | NULL | 2022-10-19 15:01:50 | | 8 | CA | NULL | 2022-10-19 15:02:15 | +----+------+-------+---------------------+ 8 rows in setトランザクションをセーブポイント
ruにロールバックします。obclient [test]> ROLLBACK TO SAVEPOINT ru; 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 | | 6 | FR | NULL | 2022-10-19 15:01:39 | | 7 | RU | NULL | 2022-10-19 15:01:50 | +----+------+-------+---------------------+ 7 rows in setクエリ結果から、
(8,'CA')はセーブポイントruの後に挿入されたデータであるため、ロールバック後にこの変更が破棄されたことがわかります。トランザクションをコミットし、テーブルの最新の変更にセーブポイント
ruより前の変更が含まれていることを確認します。obclient [test]> COMMIT; 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 | | 6 | FR | NULL | 2022-10-19 15:01:39 | | 7 | RU | NULL | 2022-10-19 15:01:50 | +----+------+-------+---------------------+ 7 rows in set
トランザクションのロールバックに関するその他の例と説明については、トランザクションのロールバックを参照してください。