セーブポイントを設定した後、特定のセーブポイントが不要になった場合、セーブポイントを解放することができます。
前提条件
セーブポイントが設定されていることを確認してください。具体的な操作については、セーブポイントの設定を参照してください。
セーブポイントの解放
以下のステートメントを使用して、セーブポイントを解放できます。
RELEASE SAVEPOINT pointname;
注意
RELEASE SAVEPOINT ステートメントの実行に成功すると、解放されたセーブポイントを使用して指定されたセーブポイント、および 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