
# ROLLBACK TO SAVEPOINT
#### 功能描述
ROLLBACK TO SAVEPOINT用于回滚到保存点，隐含地删除所有在该保存点之后建立的保存点。
回滚所有指定保存点建立之后执行的命令。保存点仍然有效，并且需要时可以再次回滚到该点。
#### 注意事项
- 不能回滚到未定义的保存点，语法上会报错。
- 在保存点方面，游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。如果一个前面打开了的游标在保存点里面，并且游标被一个FETCH命令影响，而这个保存点稍后回滚了，那么这个游标的位置仍然在FETCH让它指向的位置(也就是FETCH不会被回滚)。关闭一个游标的行为也不会被回滚给撤销掉。如果一个游标的操作导致事务回滚，那么这个游标就会置于不可执行状态，所以，尽管一个事务可以用ROLLBACK TO SAVEPOINT重新恢复，但是游标不能再使用了。
- 使用ROLLBACK TO SAVEPOINT回滚到保存点。使用RELEASE SAVEPOINT删除保存点，但是保留该保存点建立后执行的命令的效果。
 
#### 语法格式
```
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name;
```
#### 参数说明
**savepoint_name**
回滚指定保存点的名称。
#### 示例
撤销my_savepoint建立之后执行的命令（如下插入数据2的命令）的影响：
```
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的命令被撤销了。
```
![](https://support.huaweicloud.com/sqlreference-911-dws/figure/zh-cn_image_0000002617966509.png "点击放大")
游标位置不受保存点回滚的影响：
```
BEGIN;
DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;
SAVEPOINT foo;
FETCH 1 FROM foo;
```
![](https://support.huaweicloud.com/sqlreference-911-dws/figure/zh-cn_image_0000002618046405.png "点击放大")
```
ROLLBACK TO SAVEPOINT foo;
FETCH 1 FROM foo;
```
![](https://support.huaweicloud.com/sqlreference-911-dws/figure/zh-cn_image_0000002587446824.png "点击放大")
```
COMMIT;
```
#### 相关链接
[SAVEPOINT](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0263.html)，[RELEASE SAVEPOINT](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0267.html)
