セーブポイントを設定した後、特定のセーブポイントが不要になった場合は、そのセーブポイントを解放することができます。
前提条件
セーブポイントが設定されていることを確認してください。具体的な操作については、セーブポイントの設定を参照してください。
セーブポイントの解放
以下のステートメントを使用して、セーブポイントを解放できます。
RELEASE SAVEPOINT pointname;
注意
RELEASE SAVEPOINT ステートメントが正常に実行されると、解放されたセーブポイント以降に設定された他のセーブポイントや、そのセーブポイントと指定したセーブポイントとの間にある他のセーブポイントへはロールバックできなくなります。
以下の例では、セーブポイント ru を解放した後、そのセーブポイント以降に設定された他のセーブポイントや、RELEASE SAVEPOINT ステートメントとそのセーブポイントとの間にある他のセーブポイントへはロールバックできなくなることを示しています。
トランザクションを開始し、複数のセーブポイントを設定します。
obclient [test]> SET SESSION autocommit=0; Query OK, 0 rows affected obclient [test]> BEGIN; 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 | 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]> 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]> RELEASE SAVEPOINT ru; Query OK, 0 rows affectedセーブポイント
ruとcaにそれぞれロールバックしようとすると、どちらのセーブポイントも存在しないことがわかります。obclient [test]> rollback to savepoint ru; ERROR 1305 (42000): savepoint does not exist obclient [test]> rollback to savepoint ca; ERROR 1305 (42000): savepoint does not exist