2024年9月26日:PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0

ROLLBACK TO SAVEPOINT

ROLLBACK TO SAVEPOINT — 回滚到保存点

语法

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

描述

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

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

参数

savepoint_name

要回滚到的保存点。

注释

使用 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 是必须的,但PostgreSQLOracle 允许省略它。SQL 仅允许 WORK,而不是 TRANSACTION,作为 ROLLBACK 之后的噪音词。此外,SQL 有一个可选的子句 AND [ NO ] CHAINPostgreSQL 目前不支持。否则,此命令符合 SQL 标准。

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表单 报告文档问题。