2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 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 来销毁一个保存点,而不丢弃它建立之后执行的命令的效果。

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

光标(Cursors)在保存点方面具有某种非事务性的行为。在保存点内打开的任何光标将在保存点被回滚时关闭。如果一个先前已打开的光标受到在之后被回滚的保存点内的 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 ] CHAIN,目前 PostgreSQL 不支持。除此之外,该命令符合 SQL 标准。

提交更正

如果您在文档中发现任何不正确、与您的实际体验不符或需要进一步说明的内容,请使用 此表格 报告文档问题。