PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

ROLLBACK TO SAVEPOINT

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

Synopsis

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 允许省略它。SQL 只允许 WORK(而不允许 TRANSACTION)作为 ROLLBACK 之后的噪声词。此外,SQL 有一个可选子句 AND [ NO ] CHAIN,目前 PostgreSQL 尚不支持它。除此之外,该命令符合 SQL 标准。

另请参阅

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, SAVEPOINT