基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
事务保存点
更新时间:2026-06-17 15:22:41
本文介绍事务保存点的相关说明及使用。
语句语法格式
SAVEPOINT 语句可以在事务过程中标记一个"保存点",事务可以选择回滚到这个保存点。保存点是可选的,一个事务过程中也可以有多个保存点。
标记保存点的语句语法如下:
SAVEPOINT pointname;参数 是否必填 描述 示例 pointname 是 指定事务保存点的名称。 fr 释放保存点的语句语法如下:
注意
当
RELEASE SAVEPOINT语句执行成功后,不能再回滚到指定的保存点以及RELEASE SAVEPOINT语句与指定的保存点之间的任何其他保存点。RELEASE SAVEPOINT pointname;通过
ROLLBACK TO SAVEPOINT语句回滚到指定事务保存点。ROLLBACK TO SAVEPOINT pointname;回滚的详细说明,请参考 回滚事务。
示例:将一个事务回滚到一个保存点
下面示例展示了一个事务中包含多个 DML 语句和多个保存点,然后回滚到其中一个保存点,执行后只丢弃了保存点后面的那部份修改。
查看表当前记录。
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开启一个事务,设置多个保存点信息。
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当前会话能看到事务未提交的所有修改。
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回滚事务到其中一个保存点。
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提交事务,并确认表最新修改包含保存点之前的修改。
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