首批通过分布式安全可靠测评,为关键业务系统打造
回滚事务到某个保存点
更新时间:2026-04-09 19:34:05
标记保存点后,可以通过 ROLLBACK TO SAVEPOINT 语句回滚到指定的事务保存点。
前提条件
请确认已标记保存点,具体操作请参见 标记保存点。
回滚事务到保存点
您可以使用以下语句,将事务回滚到保存点。
ROLLBACK TO SAVEPOINT pointname;
其中,pointname 表示事务保存点的名称。
下面示例展示了一个事务中包含多个 DML 语句和多个保存点,然后回滚到其中一个保存点,执行后仅丢弃了保存点后面的那部分修改。
查看表当前记录。
obclient [SYS]> SELECT * FROM ordr; +----+------+-------+------------+ | ID | NAME | VALUE | GMT_CREATE | +----+------+-------+------------+ | 1 | CN | 10001 | 01-JAN-70 | | 2 | US | 10002 | 01-JAN-70 | | 3 | EN | 10003 | 01-JAN-70 | +----+------+-------+------------+ 3 rows in set开启一个事务,设置多个保存点信息。
obclient [SYS]> SET session autocommit=off; Query OK, 0 rows affected obclient [SYS]> BEGIN; Query OK, 0 rows affected obclient [SYS]> INSERT INTO ordr(id, name) VALUES(6,'FR'); Query OK, 1 row affected obclient [SYS]> SAVEPOINT fr; Query OK, 0 rows affected obclient [SYS]> INSERT INTO ordr(id, name) VALUES(7,'RU'); Query OK, 1 row affected obclient [SYS]> SAVEPOINT ru; Query OK, 0 rows affected obclient [SYS]> INSERT INTO ordr(id, name) VALUES(8,'CA'); Query OK, 1 row affected obclient [SYS]> SAVEPOINT ca; Query OK, 0 rows affected当前会话能看到事务未提交的所有修改。
obclient [SYS]> SELECT * FROM ordr; +----+------+-------+------------+ | ID | NAME | VALUE | GMT_CREATE | +----+------+-------+------------+ | 1 | CN | 10001 | 01-JAN-70 | | 2 | US | 10002 | 01-JAN-70 | | 3 | EN | 10003 | 01-JAN-70 | | 6 | FR | NULL | 01-JAN-70 | | 7 | RU | NULL | 01-JAN-70 | | 8 | CA | NULL | 01-JAN-70 | +----+------+-------+------------+ 6 rows in set回滚事务到其中一个保存点。
obclient [SYS]> ROLLBACK TO SAVEPOINT ru; Query OK, 0 rows affected obclient [SYS]> SELECT * FROM ordr; +----+------+-------+------------+ | ID | NAME | VALUE | GMT_CREATE | +----+------+-------+------------+ | 1 | CN | 10001 | 01-JAN-70 | | 2 | US | 10002 | 01-JAN-70 | | 3 | EN | 10003 | 01-JAN-70 | | 6 | FR | NULL | 01-JAN-70 | | 7 | RU | NULL | 01-JAN-70 | +----+------+-------+------------+ 5 rows in set根据查询结果可知,由于
(8,'CA')是在保存点ru之后插入的数据,回滚后,该修改被丢弃。提交事务,并确认表的最新修改包含了保存点之前的修改。
obclient [SYS]> COMMIT; Query OK, 0 rows affected obclient [SYS]> SELECT * FROM ordr; +----+------+-------+------------+ | ID | NAME | VALUE | GMT_CREATE | +----+------+-------+------------+ | 1 | CN | 10001 | 01-JAN-70 | | 2 | US | 10002 | 01-JAN-70 | | 3 | EN | 10003 | 01-JAN-70 | | 6 | FR | NULL | 01-JAN-70 | | 7 | RU | NULL | 01-JAN-70 | +----+------+-------+------------+ 5 rows in set
更多回滚事务相的示例及说明,请参见 回滚事务