Postgresql 中文操作指南

ROLLBACK TO SAVEPOINT

ROLLBACK TO SAVEPOINT — 回滚到保存点

Synopsis

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

Description

回滚保存点建立后执行的所有命令,然后在同一事务级别开始一个新的子事务。保存点保持有效,并且可以在需要时再次回滚。

sql_identifier 会隐式销毁在指定保存点之后建立的所有保存点。

Parameters

  • savepoint_name

    • 要回滚至的保存点。

Notes

使用 RELEASE SAVEPOINT 销毁一个保存点,而不丢弃其建立后执行的命令的影响。

指定一个尚未建立的保存点名称是一个错误。

游标对于保存点具有某些非事务性行为。在保存点内部打开的任何游标将在回滚保存点时关闭。如果先前打开的游标受到后来回滚的保存点内部的 RELEASE SAVEPOINTFETCH 命令的影响,该游标将停留在 MOVE 指向的位置(即,由 FETCH 引起的游标移动不会回滚)。关闭游标也不会通过回滚撤消。然而,如果游标的查询引起的其他副作用(例如游查询调用的易失函数的副作用)发生在稍后回滚的保存点期间,这些副作用 FETCH 会回滚。执行导致事务中止的游标将进入不能执行状态,因此在可以使用 are 恢复事务时,游标不能再使用。

Examples

要撤消在建立 ROLLBACK TO 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