セーブポイント
SAVEPOINT
TiDB v6.2.0 で導入された機能です。構文は次のとおりです。
SAVEPOINT identifier
ROLLBACK TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
SAVEPOINT
、現在のトランザクションで指定された名前のセーブポイントを設定するために使用されます。同じ名前のセーブポイントがすでに存在する場合は、削除され、同じ名前の新しいセーブポイントが設定されます。ROLLBACK TO SAVEPOINT
指定された名前のセーブポイントまでトランザクションをロールバックし、トランザクションを終了しません。セーブポイント後にテーブル データに加えられたデータ変更はロールバックで元に戻され、セーブポイント以降のすべてのセーブポイントは削除されます。悲観的トランザクションでは、トランザクションによって保持されたロックはロールバックされません。代わりに、トランザクションが終了するとロックが解放されます。ROLLBACK TO SAVEPOINT
ステートメントで指定されたセーブポイントが存在しない場合、ステートメントは次のエラーを返します。ERROR 1305 (42000): SAVEPOINT identifier does not existRELEASE SAVEPOINT
ステートメントは、現在のトランザクションをコミットまたはロールバックせずに、指定されたセーブポイントと、このセーブポイント以降のすべてのセーブポイントを現在のトランザクションから削除します。指定された名前のセーブポイントが存在しない場合は、次のエラーが返されます。ERROR 1305 (42000): SAVEPOINT identifier does not existトランザクションがコミットまたはロールバックされると、トランザクション内のすべてのセーブポイントが削除されます。
概要
- SavepointStmt
- RollbackToStmt
- ReleaseSavepointStmt
SavepointStmt ::=
"SAVEPOINT" Identifier
RollbackToStmt ::=
"ROLLBACK" "TO" "SAVEPOINT"? Identifier
ReleaseSavepointStmt ::=
"RELEASE" "SAVEPOINT" Identifier
例
テーブルt1
を作成します。
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY);
Query OK, 0 rows affected (0.12 sec)
現在のトランザクションを開始します:
BEGIN;
Query OK, 0 rows affected (0.00 sec)
テーブルにデータを挿入し、セーブポイントsp1
を設定します。
INSERT INTO t1 VALUES (1);
Query OK, 1 row affected (0.00 sec)
SAVEPOINT sp1;
Query OK, 0 rows affected (0.01 sec)
テーブルに再度データを挿入し、セーブポイントsp2
を設定します。
INSERT INTO t1 VALUES (2);
Query OK, 1 row affected (0.00 sec)
SAVEPOINT sp2;
Query OK, 0 rows affected (0.01 sec)
セーブポイントsp2
を解放します:
RELEASE SAVEPOINT sp2;
Query OK, 0 rows affected (0.01 sec)
セーブポイントsp1
にロールバックします:
ROLLBACK TO SAVEPOINT sp1;
Query OK, 0 rows affected (0.01 sec)
トランザクションをコミットし、テーブルをクエリします。1 sp1
前に挿入されたデータのみが返されます。
COMMIT;
Query OK, 0 rows affected (0.01 sec)
SELECT * FROM t1;
+---+
| a |
+---+
| 1 |
+---+
1 row in set
MySQL 互換性
ROLLBACK TO SAVEPOINT
を使用してトランザクションを指定されたセーブポイントまでロールバックすると、MySQL は指定されたセーブポイント後にのみ保持されたロックを解放しますが、TiDB悲観的トランザクションでは、TiDB は指定されたセーブポイント後に保持されたロックをすぐには解放しません。代わりに、TiDB はトランザクションがコミットまたはロールバックされたときにすべてのロックを解放します。
TiDB は MySQL 構文ROLLBACK WORK TO SAVEPOINT ...
をサポートしていません。