SAVEPOINT
功能描述
SAVEPOINT用于在当前事务里建立一个新的保存点。
保存点是事务中的一个特殊记号,它允许将那些在它建立后执行的命令全部回滚,把事务的状态恢复到保存点所在的时刻。
注意事项
- 使用ROLLBACK TO SAVEPOINT回滚到一个保存点。使用RELEASE SAVEPOINT删除一个保存点,但是保留该保存点建立后执行的命令的效果。
- 保存点只能在一个事务块里面建立。在一个事务里面可以定义多个保存点。
- 由于节点故障或者通信故障引起的节点线程或进程退出导致的报错,以及由于COPY FROM操作中源数据与目标表的表结构不一致导致的报错,均不能正常回滚到保存点之前,而是整个事务回滚。
- SQL标准要求,使用savepoint建立一个同名保存点时,需要自动删除前面那个同名保存点。在Vastbase数据库里,我们将保留旧的保存点,但是在回滚或者释放的时候,只使用最近的那个。释放了新的保存点将导致旧的再次成为ROLLBACK TO SAVEPOINT和RELEASE SAVEPOINT可以访问的保存点。除此之外,SAVEPOINT是完全符合SQL标准的。
语法格式
SAVEPOINT savepoint_name;
参数说明
savepoint_name
新建保存点的名称。
示例
1、创建一个新表。
CREATE TABLE table1(a int);
2、开启事务。
START TRANSACTION;
3、插入数据。
INSERT INTO table1 VALUES (1);
4、建立保存点。
SAVEPOINT my_savepoint;
5、插入数据。
INSERT INTO table1 VALUES (2);
6、回滚保存点。
ROLLBACK TO SAVEPOINT my_savepoint;
7、插入数据。
INSERT INTO table1 VALUES (3);
8、提交事务。
COMMIT;
9、查询表的内容,会同时看到1和3,不能看到2,因为2被回滚。
SELECT * FROM table1;
查询结果显示为:
a
---
1
3
(2 rows)
10、删除表。
DROP TABLE table1;
11、创建一个新表。
CREATE TABLE table2(a int);
12、开启事务。
START TRANSACTION;
13、插入数据。
INSERT INTO table2 VALUES (3);
14、建立保存点。
SAVEPOINT my_savepoint;
15、插入数据。
INSERT INTO table2 VALUES (4);
16、回滚保存点。
RELEASE SAVEPOINT my_savepoint;
17、提交事务。
COMMIT;
18、查询表的内容,会同时看到3和4。
SELECT * FROM table2;
查询结果为:
a
---
3
4
(2 rows)
19、删除表。
DROP TABLE table2;