🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# ROLLBACK TO SAVEPOINT ## Name ROLLBACK TO SAVEPOINT -- 回滚到一个保存点 ## Synopsis ``` ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] _savepoint_name_ ``` ## 描述 回滚所有指定保存点建立之后执行的命令。保存点仍然有效,并且需要时可以再次回滚到该点。 `ROLLBACK TO SAVEPOINT`隐含地删除所有在该保存点之后建立的保存点。 ## 参数 `_savepoint_name_` 回滚截至的保存点。 ## 注意 使用[RELEASE SAVEPOINT](#calibre_link-1212)删除一个保存点, 而不会抛弃这个保存点建立之后执行的命令结果。 声明一个还没有建立的保存点名字是一个错误。 在保存点方面,游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。 如果一个前面打开了的游标在保存点里面,并且游标被一个`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允许省略`SAVEPOINT`关键字。SQL 只允许`WORK` 而不是`TRANSACTION`作为`ROLLBACK`后面的无意义关键字。还有, SQL 有一个可选的`AND [ NO ] CHAIN`子句,目前PostgreSQL还不支持。 否则,这个命令完全兼容 SQL 标准。 ## 又见 [BEGIN](#calibre_link-493), [COMMIT](#calibre_link-494), [RELEASE SAVEPOINT](#calibre_link-1212), [ROLLBACK](#calibre_link-495), [SAVEPOINT](#calibre_link-1310)