ROLLBACK TO

Name

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

Synopsis

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

描述

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

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

参数

savepoint_name

回滚截至的保存点。

注意

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

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

在保存点方面,游标有一些非事务性的行为。任何在保存点里打开的游标不会在回滚掉这个保存点之后关闭。 如果一个游标在保存点里面,并且游标被一个 FETCH 命令影响, 而这个保存点稍后回滚了,那么这个游标的位置仍然在 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:2003 标准声明关键字 SAVEPOINT 是必须的。 PostgreSQLOracle 允许省略 SAVEPOINT 关键字。 SQL:2003 只允许 WORK,不允许 TRANSACTION 作为 ROLLBACK 后面的噪音键字。 还有,SQL:2003 有一个可选的子句 AND [ NO ] CHAIN, 目前 PostgreSQL 还不支持。否则,这个命令完全兼容 SQL 标准。

又见

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, SAVEPOINT