更新时间:2026-07-02 GMT+08:00
ROLLBACK TO SAVEPOINT
功能描述
ROLLBACK TO SAVEPOINT用于回滚到保存点,隐含地删除所有在该保存点之后建立的保存点。
回滚所有指定保存点建立之后执行的命令。保存点仍然有效,并且需要时可以再次回滚到该点。
注意事项
- 不能回滚到未定义的保存点,语法上会报错。
- 在保存点方面,游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。如果一个前面打开了的游标在保存点里面,并且游标被一个FETCH命令影响,而这个保存点稍后回滚了,那么这个游标的位置仍然在FETCH让它指向的位置(也就是FETCH不会被回滚)。关闭一个游标的行为也不会被回滚给撤销掉。如果一个游标的操作导致事务回滚,那么这个游标就会置于不可执行状态,所以,尽管一个事务可以用ROLLBACK TO SAVEPOINT重新恢复,但是游标不能再使用了。
- 使用ROLLBACK TO SAVEPOINT回滚到保存点。使用RELEASE SAVEPOINT删除保存点,但是保留该保存点建立后执行的命令的效果。
语法格式
1 | ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name; |
参数说明
savepoint_name
回滚指定保存点的名称。
示例
撤销my_savepoint建立之后执行的命令(如下插入数据2的命令)的影响:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DROP SCHEMA IF EXISTS tpcds CASCADE; CREATE SCHEMA tpcds; CREATE TABLE tpcds.table1 ( id integer ); BEGIN; -- 开启事务 INSERT INTO tpcds.table1 VALUES (1); -- 插入数据1 SAVEPOINT my_savepoint; -- 创建保存点 INSERT INTO tpcds.table1 VALUES (2); -- 插入数据2 ROLLBACK TO SAVEPOINT my_savepoint; -- 回滚到保存点(删除数据2) INSERT INTO tpcds.table1 VALUES (3); -- 继续插入数据3 COMMIT; -- 提交事务 SELECT * FROM tpcds.table1; --验证数据发现,插入数据2的命令被撤销了。 |

游标位置不受保存点回滚的影响:
1 2 3 4 | BEGIN; DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2; SAVEPOINT foo; FETCH 1 FROM foo; |

1 2 | ROLLBACK TO SAVEPOINT foo; FETCH 1 FROM foo; |

1 | COMMIT; |