ROLLBACK TO SAVEPOINT — 回滚到保存点
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
回滚所有在建立保存点之后执行的命令,然后在新子事务的相同事务级别上启动。该保存点仍然有效,如果需要,可以稍后再次回滚到它。
ROLLBACK TO SAVEPOINT
会隐式销毁在命名的保存点之后建立的所有保存点。
savepoint_name
要回滚到的保存点。
使用 RELEASE SAVEPOINT
来销毁一个保存点,而不丢弃它建立之后执行的命令的效果。
指定一个未建立的保存点名称是一个错误。
光标(Cursors)在保存点方面具有某种非事务性的行为。在保存点内打开的任何光标将在保存点被回滚时关闭。如果一个先前已打开的光标受到在之后被回滚的保存点内的 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 标准。
如果您在文档中发现任何不正确、与您的实际体验不符或需要进一步说明的内容,请使用 此表格 报告文档问题。