📣

TiDB Cloud Serverless が
Starter
に変わりました!このページは自動翻訳されたものです。
原文はこちらからご覧ください。

セーブポイント

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 exist
  • RELEASE SAVEPOINT文は、現在のトランザクションをコミットまたはロールバックせずに、指定されたセーブポイントとそれ以降のすべてのセーブポイントを現在のトランザクションから削除します。指定された名前のセーブポイントが存在しない場合は、次のエラーが返されます。

    ERROR 1305 (42000): SAVEPOINT identifier does not exist

    トランザクションがコミットまたはロールバックされると、トランザクション内のすべてのセーブポイントが削除されます。

概要

SavepointStmt
SAVEPOINTIdentifier
RollbackToStmt
ROLLBACKTOSAVEPOINTIdentifier
ReleaseSavepointStmt
RELEASESAVEPOINTIdentifier

テーブル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 ...サポートしていません。

参照

このページは役に立ちましたか?