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;
TheSQL标准规定关键字 SAVEPOINT
是强制性的,但 PostgreSQL 和 Oracle 允许省略它。SQL 只允许 WORK
,而不是 TRANSACTION
,作为 ROLLBACK
之后的噪音词。此外,SQL 还有一个可选的子句 AND [ NO ] CHAIN
,目前 PostgreSQL 不支持它。除此之外,此命令符合 SQL 标准。
如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表单来报告文档问题。