SAVEPOINT

    警告

    SAVEPOINT 特性不支持与 TiDB Binlog 一起使用,也不支持在关闭 tidb_constraint_check_in_place_pessimistic 的悲观事务中使用。

    • SAVEPOINT 语句用于在当前事务中,设置一个指定名字保存点。如果已经存在相同名字的保存点,就删除已有的保存点并设置新的保存点。

    • 如果 ROLLBACK TO SAVEPOINT 语句中指定名称的保存点不存在,则会返回以下错误信息:

      1. ERROR 1305 (42000): SAVEPOINT identifier does not exist
    • RELEASE SAVEPOINT 语句将从当前事务中删除指定名称及之后的所有保存点,而不会提交或回滚当前事务。如果指定名称的保存点不存在,则会返回以下错误信息:

      1. ERROR 1305 (42000): SAVEPOINT identifier does not exist

      当事务提交或者回滚后,事务中所有保存点都会被删除。

    创建表 t1

    1. CREATE TABLE t1 (a int NOT NULL PRIMARY KEY);
    1. Query OK, 0 rows affected (0.12 sec)
    1. BEGIN;

      向表中插入数据并设置保存点 sp1

      1. Query OK, 1 row affected (0.00 sec)
      1. SAVEPOINT sp1;
      1. Query OK, 0 rows affected (0.01 sec)

      向表中再次插入数据并设置保存点 sp2

      1. INSERT INTO t1 VALUES (2);
      1. Query OK, 1 row affected (0.00 sec)
      1. SAVEPOINT sp2;

      释放保存点 sp2

      1. RELEASE SAVEPOINT sp2;
      1. Query OK, 0 rows affected (0.01 sec)

      回滚至保存点 :

      1. ROLLBACK TO SAVEPOINT sp1;
      1. Query OK, 0 rows affected (0.01 sec)
      1. COMMIT;
        1. +---+
        2. | a |
        3. +---+
        4. | 1 |
        5. +---+
        6. 1 row in set

        使用 语句将事物回滚到指定保存点时,MySQL 会释放该保存点之后才持有的锁,但在 TiDB 悲观事务中,不会立即释放该保存点之后才持有的锁,而是等到事务提交或者回滚时,才释放全部持有的锁。