暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase Cloud快速入门第84期:如何回滚事务到某个保存点?

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/


标记保存点后,可以通过 ROLLBACK TO SAVEPOINT 语句回滚到指定的事务保存点。

前提条件

请确认已标记保存点,具体操作请参见 标记保存点

回滚事务到保存点

可以使用以下语句将事务回滚到某一个保存点。

ROLLBACK TO SAVEPOINT pointname;

其中,pointname 表示事务保存点的名称。

以下示例展示了一个事务中包含多个 DML 语句和多个保存点,然后回滚到其中一个保存点,执行后仅丢弃了保存点后面的那部分修改。

  1. 查看表当前记录。

    obclient [test]> SELECT * FROM ordr;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   | 10001 | 2022-10-19 14:51:12 |
    |  2 | US   | 10002 | 2022-10-19 14:51:12 |
    |  3 | EN   | 10003 | 2022-10-19 14:51:12 |
    |  4 | JP   |  NULL | 2022-10-19 14:51:44 |
    |  5 | CN   |  NULL | 2022-10-19 14:53:56 |
    +----+------+-------+---------------------+
    5 rows in set
    
  2. 开启一个事务,设置多个保存点信息。

    obclient [test]> SET SESSION autocommit=0;
    Query OK, 0 rows affected 
    
    obclient [test]> BEGIN;
    Query OK, 0 rows affected 
    
    obclient [test]> INSERT INTO ordr(id, name) VALUES(6,'FR');
    Query OK, 1 row affected 
    
    obclient [test]> SAVEPOINT fr;
    Query OK, 0 rows affected 
    
    obclient [test]> INSERT INTO ordr(id, name) VALUES(7,'RU');
    Query OK, 1 row affected 
    
    obclient [test]>  SAVEPOINT ru;
    Query OK, 0 rows affected 
    
    obclient [test]> INSERT INTO ordr(id, name) VALUES(8,'CA');
    Query OK, 1 row affected 
    
    obclient [test]> SAVEPOINT ca;
    Query OK, 0 rows affected
    
  3. 当前会话能看到事务未提交的所有修改。

    obclient [test]> SELECT * FROM ordr;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   | 10001 | 2022-10-19 14:51:12 |
    |  2 | US   | 10002 | 2022-10-19 14:51:12 |
    |  3 | EN   |  1003 | 2022-10-19 14:51:12 |
    |  4 | JP   |  NULL | 2022-10-19 14:51:44 |
    |  5 | CN   |  NULL | 2022-10-19 14:53:56 |
    |  6 | FR   |  NULL | 2022-10-19 15:01:39 |
    |  7 | RU   |  NULL | 2022-10-19 15:01:50 |
    |  8 | CA   |  NULL | 2022-10-19 15:02:15 |
    +----+------+-------+---------------------+
    8 rows in set
    
  4. 回滚事务到其中一个保存点 ru

    obclient [test]> ROLLBACK TO SAVEPOINT ru;
    Query OK, 0 rows affected 
    
    obclient [test]> SELECT * FROM ordr;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   | 10001 | 2022-10-19 14:51:12 |
    |  2 | US   | 10002 | 2022-10-19 14:51:12 |
    |  3 | EN   |  1003 | 2022-10-19 14:51:12 |
    |  4 | JP   |  NULL | 2022-10-19 14:51:44 |
    |  5 | CN   |  NULL | 2022-10-19 14:53:56 |
    |  6 | FR   |  NULL | 2022-10-19 15:01:39 |
    |  7 | RU   |  NULL | 2022-10-19 15:01:50 |
    +----+------+-------+---------------------+
    7 rows in set
    

    根据查询结果可知,由于 (8,'CA') 是在保存点 ru 之后插入的数据,回滚后,该修改被丢弃。

  5. 提交事务,并确认表的最新修改中包含了保存点 ru 之前的修改。

    obclient [test]> COMMIT;
    Query OK, 0 rows affected
    
    obclient [test]> SELECT * FROM ordr;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   | 10001 | 2022-10-19 14:51:12 |
    |  2 | US   | 10002 | 2022-10-19 14:51:12 |
    |  3 | EN   |  1003 | 2022-10-19 14:51:12 |
    |  4 | JP   |  NULL | 2022-10-19 14:51:44 |
    |  5 | CN   |  NULL | 2022-10-19 14:53:56 |
    |  6 | FR   |  NULL | 2022-10-19 15:01:39 |
    |  7 | RU   |  NULL | 2022-10-19 15:01:50 |
    +----+------+-------+---------------------+
    7 rows in set
    
    

更多回滚事务相的示例及说明,请参见 回滚事务



欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论