选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

文档 / SQL 命令 / 事务控制

SQL COMMAND · 事务控制

ROLLBACK TO SAVEPOINT

回滚到一个保存点

ROLLBACK事务控制引入 10(基线)现存至 20 devel0 次语法变更

动词
ROLLBACK
对象
TO SAVEPOINT
引入版本
10(基线)
状态
现存
语法变更次数
0
手册小节数
6

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 无变化。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

ROLLBACK WORK TRANSACTION TO SAVEPOINT savepoint_name

语法概要

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

PostgreSQL 18 手册 · 查看完整参考页

描述

回滚该保存点建立后执行的所有命令,然后在同一事务层级启动一个新的 子事务。该保存点仍然有效,如有需要,之后还可以再次回滚到它。

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

参数

savepoint_name

要回滚到的保存点名称。

注解

使用RELEASE SAVEPOINT可以销毁一个保存点, 而不丢弃在它建立之后执行的命令所产生的效果。

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

就保存点而言,游标带有一些非事务性的行为。凡是在某个保存点内打开的游标, 在回滚该保存点时都会被关闭。如果先前打开的游标在某个随后又被回滚的保存点内受到了 FETCHMOVE命令的影响,那么该游标会保留在这些命令使其指向的位置上 (也就是说,由FETCHMOVE引起的游标移动不会被回滚)。 关闭游标同样不会因回滚而撤销。不过,如果游标查询导致了其他副作用(例如该查询调用的 易变函数带来的副作用),且这些副作用发生在后来被回滚的保存点期间,那么它们 被回滚。如果某个游标的执行导致事务中止,该游标会进入不可执行状态, 因此即使事务可以通过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 只允许在ROLLBACK之后使用WORK作为噪声词, 不允许使用TRANSACTION。此外,SQL 还有一个可选子句 AND [ NO ] CHAIN,而PostgreSQL当前尚不支持。 除此之外,该命令符合 SQL 标准。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 14← 13正文更新

    正文更新

同组命令

命令动词对象版本变动最近变更
TRANSACTIONS事务控制15 条
ABORTABORT 121 次
中止当前事务现存
BEGINBEGIN
开始一个事务块现存
COMMITCOMMIT 121 次
提交当前事务现存
ENDEND 121 次
提交当前事务现存
ROLLBACKROLLBACK 121 次
中止当前事务现存
SAVEPOINTSAVEPOINT
在当前事务中定义一个新的保存点现存
SET CONSTRAINTSSETCONSTRAINTS
为当前事务设置约束检查时机现存
WAIT FORWAITFOR
等待 WAL 达到目标 LSN现存
COMMIT PREPAREDCOMMITPREPARED
提交一个先前为两阶段提交而预备的事务现存
ROLLBACK PREPAREDROLLBACKPREPARED
回滚一个先前为两阶段提交而预备的事务现存
RELEASE SAVEPOINTRELEASESAVEPOINT
释放一个先前定义的保存点现存
ROLLBACK TO SAVEPOINTROLLBACKTO SAVEPOINT
回滚到一个保存点现存
PREPARE TRANSACTIONPREPARETRANSACTION
为两阶段提交准备当前事务现存
SET TRANSACTIONSETTRANSACTION
设置当前事务的特性现存
START TRANSACTIONSTARTTRANSACTION
开始一个事务块现存