©
本文档使用 PHP中文网手册 发布
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
回滚所有指定保存点建立之后执行的命令。保存点仍然有效,并且需要时可以再次回滚到该点。
ROLLBACK TO SAVEPOINT隐含地删除所有在该保存点之后建立的保存点。
回滚截至的保存点。
使用RELEASE SAVEPOINT删除一个保存点,而不会抛弃这个保存点建立之后执行的命令结果。
声明一个还没有建立的保存点名字是一个错误。
在保存点方面,游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。 如果一个前面打开了的游标在保存点里面, 并且游标被一个FETCH或者MOVE command 命令影响,而这个保存点稍后回滚了, 那么这个游标仍然在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允许省略TRANSACTION关键字。 SQL只允许WORK作为ROLLBACK后面的无意义关键字。 还有,SQL有一个可选的AND [ NO ] CHAIN子句, 目前PostgreSQL还不支持。否则,这个命令完全兼容SQL标准。