Skip to content

ROLLBACK TO SAVEPOINT

ROLLBACK TO SAVEPOINT — 回滚到保存点

概要

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

描述

回滚在建立保存点后执行的所有命令,然后在相同的事务级别开始一个新的子事务。如果需要,保存点仍然有效,可以再次回滚到该保存点。

ROLLBACK TO SAVEPOINT隐式销毁在命名保存点之后建立的所有保存点。

参数

保存点名称

要回滚到的保存点。

注释

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

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

游标在保存点方面具有某种非事务性行为。在保存点内打开的任何游标都将在保存点回滚时关闭。如果先前打开的游标受到保存点内FETCHMOVE命令的影响,并且该保存点后来被回滚,则游标将保持在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 标准。

另请参见

BEGINCOMMITRELEASE SAVEPOINTROLLBACKSAVEPOINT