セーブポイント

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

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

テーブルを作成します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)

トランザクションをコミットし、テーブルをクエリします。 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 はすべてのロックを解放します。

こちらもご覧ください