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

事务保存点

SQL新手 2022-12-08
168

本文介绍事务保存点的相关说明及使用。

语句语法格式

SAVEPOINT 语句可以在事务过程中标记一个"保存点",事务可以选择回滚到这个保存点。保存点是可选的,一个事务过程中也可以有多个保存点。

  • 标记保存点的语句语法如下:

    SAVEPOINT pointname;
    
    参数是否必填描述示例
    pointname指定事务保存点的名称。fr
  • 释放保存点的语句语法如下:

    注意

    当 RELEASE SAVEPOINT 语句执行成功后,不能再回滚到指定的保存点以及 RELEASE SAVEPOINT 语句与指定的保存点之间的任何其他保存点。

    RELEASE SAVEPOINT pointname;
    
  • 通过 ROLLBACK TO SAVEPOINT 语句回滚到指定事务保存点。

    ROLLBACK TO SAVEPOINT pointname;
    

    回滚的详细说明,请参考 回滚事务

示例:将一个事务回滚到一个保存点

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

  1. 查看表当前记录。

    obclient> SELECT * FROM t_insert;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   | 10001 | 1970-01-01 16:05:45 |
    |  2 | US   | 10002 | 1970-01-01 16:05:54 |
    |  3 | UK   | 10003 | 1970-01-01 16:05:54 |
    +----+------+-------+---------------------+
    3 rows in set
    
  2. 开启一个事务,设置多个保存点信息。

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

    obclient> SELECT * FROM t_insert;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   | 10001 | 1970-01-01 16:05:45 |
    |  2 | US   | 10002 | 1970-01-01 16:05:54 |
    |  3 | UK   | 10003 | 1970-01-01 16:05:54 |
    |  6 | FR   |  NULL | 1970-01-01 16:26:22 |
    |  7 | RU   |  NULL | 1970-01-01 16:26:32 |
    |  8 | CA   |  NULL | 1970-01-01 16:26:42 |
    +----+------+-------+---------------------+
    6 rows in set
    
  4. 回滚事务到其中一个保存点。

    obclient> ROLLBACK TO SAVEPOINT ru;
    Query OK, 0 rows affected 
    
    obclient> SELECT * FROM t_insert;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   | 10001 | 1970-01-01 16:05:45 |
    |  2 | US   | 10002 | 1970-01-01 16:05:54 |
    |  3 | UK   | 10003 | 1970-01-01 16:05:54 |
    |  6 | FR   |  NULL | 1970-01-01 16:26:22 |
    |  7 | RU   |  NULL | 1970-01-01 16:26:32 |
    +----+------+-------+---------------------+
    5 rows in set
    
  5. 提交事务,并确认表最新修改包含保存点之前的修改。

    obclient> COMMIT;
    Query OK, 0 rows affected 
    obclient> SELECT * FROM t_insert;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   | 10001 | 1970-01-01 16:05:45 |
    |  2 | US   | 10002 | 1970-01-01 16:05:54 |
    |  3 | UK   | 10003 | 1970-01-01 16:05:54 |
    |  6 | FR   |  NULL | 1970-01-01 16:26:22 |
    |  7 | RU   |  NULL | 1970-01-01 16:26:32 |
    +----+------+-------+---------------------+
    5 rows in set
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论