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 标准。