回滚到保存点

回滚到保存点—回滚到保存点

Synopsis

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

Description

回滚构建保存点后执行的所有命令。该保存点保持有效,可以在需要时稍后回滚。

ROLLBACK TO SAVEPOINT隐式销毁在指定保存点之后构建的所有保存点。

Parameters

  • savepoint_name

    • 要回滚的保存点。

Notes

使用RELEASE SAVEPOINT销毁保存点,而不会丢弃构建保存点后执行的命令的效果。

指定尚未构建的保存点名称是错误的。

游标相对于保存点具有某种非事务性的行为。当回滚保存点时,在该保存点内打开的所有游标都将关闭。如果先前打开的游标受保存点内的FETCHMOVE命令影响,随后又回滚,则该游标将停留在FETCH所指向的位置(即,由FETCH引起的光标运动不会回滚)。关闭游标也不会通过回滚来撤消。但是,如果游标的查询所引起的其他副作用(例如查询调用的 volatile 函数的副作用)会在回退的保存点期间发生,则会被回退。由于其执行导致事务中止的游标处于无法执行状态,因此尽管可以使用ROLLBACK TO SAVEPOINT还原该事务,但不能再使用该游标。

Examples

要撤消在构建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;

Compatibility

SQL 标准指定关键字SAVEPOINT为必填项,但 PostgreSQL 和 Oracle 允许省略。 SQL 只允许WORK而不是TRANSACTION作为ROLLBACK之后的干扰词。另外,SQL 具有可选的子句AND [ NO ] CHAIN,PostgreSQL 目前不支持该子句。否则,此命令符合 SQL 标准。

See Also

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, SAVEPOINT