ROLLBACK

说明

回滚一个事务或回滚到某个保存点

语法

rollback ::=

参数

WORK

表示回滚一个事务。此参数没有意义。

TRANSACTION

表示回滚一个事务。此参数没有意义。

savepoint_name

要回滚到某个保存点时该保存点的名字。

注解

如果此时不在一个事务中,或者保存点不存在,将导致出错。

当回滚整个事务时,与语句 ABORT; 的效果相同,都可以消除事务中的动作对数据库产生的影响。当回滚到某个保存点时,将消除这个保存点之后的动作对数据库产生的影响。

若DDLCOMMITBEHAVIOR配置参数为0,且当前位于显性事务中,DDL语句执行将会自动提交先前事务,通过单独事务完成DDL操作,并最后自动开启新的事务。即显性事务中DDL操作分三个过程:COMMIT、DDL、BEGIN,且最终事务不继承原有事务的属性。

示例

示例1: 回滚事务

--  清理环境
DROP TABLE tab1 CASCADE;


--  创建表并插入数据
CREATE TABLE tab1 (a INT);

INSERT INTO tab1 VALUES(100);
INSERT INTO tab1 VALUES(200);


SELECT * FROM tab1 ORDER BY a;
A(int)      |
------------
100         |
------------
200         |
总数目:2


--  开始事务
BEGIN;

INSERT INTO tab1 VALUES(300);


--  表中有 3 条数据
SELECT * FROM tab1 ORDER BY a;
A(int)      |
------------
100         |
------------
200         |
------------
300         |
总数目:3

--  设置保存点 sp1
SAVEPOINT sp1;

INSERT INTO tab1 VALUES(400);


--  表中有 4 条数据
SELECT * FROM tab1 ORDER BY a;
A(int)      |
------------
100         |
------------
200         |
------------
300         |
------------
400         |
总数目:4

--  回滚到保存点 sp1
ROLLBACK TO sp1;


--  表中有 3 条数据
SELECT * FROM tab1 ORDER BY a;
A(int)      |
------------
100         |
------------
200         |
------------
300         |
总数目:3

--  回滚整个事务
ROLLBACK;


--  表中有 2 条数据
SELECT * FROM tab1 ORDER BY a;
A(int)      |
------------
100         |
------------
200         |
总数目:2


--  删除表
DROP TABLE tab1;