首批通过分布式安全可靠测评,为关键业务系统打造
Savepoint
更新时间:2024-04-24 14:53:02
Savepoint 是 OceanBase 数据库提供的可以由用户定义的一个事务内的执行标记。用户可以通过在事务内定义若干标记并在需要时将事务恢复到指定标记时的状态。
例如,当用户在执行过程中在定义了某个 Savepoint 之后执行了一些错误的操作,用户不需要回滚整个事务再重新执行,而是可以通过执行 ROLLBACK TO 命令来将 Savepoint 之后的修改回滚。
如下表所示的示例,用户可以通过创建 Savepoint sp1 来对之后插入的数据执行回滚。
| 命令 | 解释 |
|---|---|
BEGIN; |
开启事务 |
INSERT INTO a VALUES(1); |
插入行 1 |
SAVEPOINT sp1; |
创建名为 sp1 的 Savepoint |
INSERT INTO a VALUES(2); |
插入行 2 |
SAVEPOINT sp2; |
创建名为 sp2 的 Savepoint |
ROLLBACK TO sp1; |
将修改回滚到 sp1 |
INSERT INTO a VALUES(3); |
插入行 3 |
COMMIT; |
提交事务 |
在 OceanBase 数据库的实现中,事务执行过程中的修改都有一个对应的"sql sequence",该值在事务执行过程中是递增的(不考虑并行执行的场景),创建 Savepoint 的操作实际上是将用户创建的 Savepoint 名字对应到事务执行的当前"sql sequence"上,当执行 ROLLBACK TO 命令时,OceanBase 数据库内部会执行以下操作:
将事务内的所有大于该 Savepoint 对应"sql sequence"的修改全部回滚,并释放对应的行锁,例如示例中的行 2。
删除该 Savepoint 之后创建的所有 Savepoint,例如示例中的
sp2。
ROLLBACK TO 命令执行成功后,事务仍然可以继续操作。
说明
DBLink 写支持 SAVEPOINT 功能,允许执行事务回滚到指定的保存点。有关 DBLink 写相关信息,请参见 通过 DBLink 修改远端数据库中的数据。