SAVEPOINT

    注意事项

    • 使用ROLLBACK TO SAVEPOINT回滚到一个保存点。使用RELEASE SAVEPOINT删除一个保存点,但是保留该保存点建立后执行的命令的效果。
    • 保存点只能在一个事务块里面建立。在一个事务里面可以定义多个保存点。
    • 由于节点故障或者通信故障引起的节点线程或进程退出导致的报错,以及由于COPY FROM操作中源数据与目标表的表结构不一致导致的报错,均不能正常回滚到保存点之前,而是整个事务回滚。
    • SQL标准要求,使用savepoint建立一个同名保存点时,需要自动删除前面那个同名保存点。在openGauss数据库里,我们将保留旧的保存点,但是在回滚或者释放的时候,只使用最近的那个。释放了新的保存点将导致旧的再次成为ROLLBACK TO SAVEPOINT和RELEASE SAVEPOINT可以访问的保存点。除此之外,SAVEPOINT是完全符合SQL标准的。

    参数说明

    1. openGauss=# CREATE TABLE table1(a int);
    2. --开启事务。
    3. openGauss=# START TRANSACTION;
    4. --插入数据。
    5. openGauss=# INSERT INTO table1 VALUES (1);
    6. --建立保存点。
    7. openGauss=# SAVEPOINT my_savepoint;
    8. --插入数据。
    9. openGauss=# INSERT INTO table1 VALUES (2);
    10. --回滚保存点。
    11. openGauss=# ROLLBACK TO SAVEPOINT my_savepoint;
    12. openGauss=# INSERT INTO table1 VALUES (3);
    13. --提交事务。
    14. openGauss=# COMMIT;
    15. --查询表的内容,会同时看到13,不能看到2,因为2被回滚。
    16. openGauss=# SELECT * FROM table1;
    17. --删除表。
    18. openGauss=# DROP TABLE table1;
    19. --创建一个新表。
    20. openGauss=# CREATE TABLE table2(a int);
    21. openGauss=# START TRANSACTION;
    22. openGauss=# INSERT INTO table2 VALUES (3);
    23. --建立保存点。
    24. openGauss=# SAVEPOINT my_savepoint;
    25. --插入数据。
    26. openGauss=# INSERT INTO table2 VALUES (4);
    27. --回滚保存点。
    28. openGauss=# RELEASE SAVEPOINT my_savepoint;
    29. --提交事务。
    30. openGauss=# COMMIT;
    31. --查询表的内容,会同时看到34
    32. openGauss=# SELECT * FROM table2;

    相关链接