VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

ROLLBACK TO SAVEPOINT

功能描述

ROLLBACK TO SAVEPOINT用于回滚到一个保存点,隐含地删除所有在该保存点之后建立的保存点。

回滚所有指定保存点建立之后执行的命令。保存点仍然有效,并且需要时可以再次回滚到该点。

注意事项

  • 不能回滚到一个未定义的保存点,语法上会报错。
  • 在保存点方面,游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。如果一个前面打开了的游标在保存点里面,并且游标被一个FETCH命令影响,而这个保存点稍后回滚了,那么这个游标的位置仍然在FETCH让它指向的位置(也就是FETCH不会被回滚)。关闭一个游标的行为也不会被回滚给撤消掉。如果一个游标的操作导致事务回滚,那么这个游标就会置于不可执行状态,所以,尽管一个事务可以用ROLLBACK TO SAVEPOINT重新恢复,但是游标不能再使用了。
  • 使用ROLLBACK TO SAVEPOINT回滚到一个保存点。使用RELEASE SAVEPOINT删除一个保存点,但是保留该保存点建立后执行的命令的效果。

语法格式

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name;

参数说明

  • savepoint_name

    将要回滚到的保存点。

  • WORK | TRANSACTION

    可选关键字。除了增加可读性,没有任何其他作用。

示例

1、开启一个事务。

START TRANSACTION;

2、建立一个保存点。

SAVEPOINT my_savepoint;

3、回滚到指定保存点。

ROLLBACK TO SAVEPOINT my_savepoint;

4、声明一个游标。

DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;

5、建立一个保存点。

SAVEPOINT foo;

6、抓取1到游标foo中。

FETCH 1 FROM foo;

返回结果为:

 ?column? 
----------
        1
(1 row)

7、回滚到指定保存点foo。

ROLLBACK TO SAVEPOINT foo;

8、重新抓取。

FETCH 1 FROM foo;

返回结果如下,表示游标位置不受保存点回滚的影响。

 ?column?
----------
        2
(1 row)

9、删除保存点并提交事务。

RELEASE SAVEPOINT my_savepoint;
COMMIT;

相关链接

SAVEPOINTRELEASE SAVEPOINT