ROLLBACK TO SAVEPOINT — 回滚到保存点
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
回滚保存点建立后执行的所有命令,然后在相同的事务级别启动一个新的子事务。如果需要,保存点仍然有效,稍后可以再次回滚到该保存点。
ROLLBACK TO SAVEPOINT
会隐式销毁在指定保存点后建立的所有保存点。
savepoint_name
要回滚到的保存点。
使用 RELEASE SAVEPOINT
可以在不放弃在其建立后执行的命令所产生的影响的情况下销毁一个保存点。
指定一个尚未建立的保存点名称是错误的。
游标在保存点方面具有一定非事务性行为。在保存点内打开的任何游标都会在保存点回滚时关闭。如果一个先前打开的游标在稍后回滚的保存点内受 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 标准。