ROLLBACK TO SAVEPOINT

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 |  | 下一页

# ROLLBACK TO SAVEPOINT

## 名称

ROLLBACK TO SAVEPOINT -- 回滚到一个保存点

## 大纲

    ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

## 描述

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

`ROLLBACK TO SAVEPOINT`隐含地删除所有在该保存点之后建立的保存点。

## 参数

`savepoint_name`

  回滚截至的保存点。

## 注意

使用RELEASE SAVEPOINT删除一个保存点， 而不会抛弃这个保存点建立之后执行的命令结果。

声明一个还没有建立的保存点名字是一个错误。

在保存点方面，游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。 如果一个前面打开了的游标在保存点里面，并且游标被一个`FETCH`或`MOVE`命令影响， 而这个保存点稍后回滚了，那么这个游标仍然在`FETCH`让它指向的位置 (也就是，由`FETCH`造成的游标动作不会被回滚)。关闭一个游标的行为也不会被回滚给撤消掉。 但是，如果由游标查询引起的副作用（如查询调用不稳定函数引起的副作用）在一个稍后会回滚的保存点发生， 那么他们也会回滚。如果一个游标的操作导致事务回滚，那么这个游标就会置于不可执行状态， 所以，尽管一个事务可以用`ROLLBACK TO SAVEPOINT`重新恢复，但是游标不能再使用了。

## 例子

撤销`my_savepoint`建立之后执行的命令的影响：

    ROLLBACK TO SAVEPOINT my_savepoint;

游标位置不受保存点回滚的影响：

    BEGIN;

    DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;

    SAVEPOINT foo;

    FETCH 1 FROM foo;
     ?column?
    ----------
            1

    ROLLBACK TO SAVEPOINT foo;

    FETCH 1 FROM foo;
     ?column?
    ----------
            2

    COMMIT;

## 兼容性

SQL标准声明关键字`SAVEPOINT`是必须的，但是PostgreSQL 和Oracle允许省略`SAVEPOINT`关键字。SQL 只允许`WORK` 而不是`TRANSACTION`作为`ROLLBACK`后面的无意义关键字。还有， SQL 有一个可选的`AND [ NO ] CHAIN`子句，目前PostgreSQL还不支持。 否则，这个命令完全兼容 SQL 标准。

## 又见

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, SAVEPOINT

上一页 | 起始页 | 下一页
ROLLBACK PREPARED | 上一级 | SAVEPOINT