SAVEPOINT
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)
提交事务并查询表,只会返回在 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 ...
。