事务处理控制语句

事务控制主要包含以下几种语句:

COMMIT

结束当前的事务并对事务中所做的所有的更改进行持久化处理,同时擦除所有保存点并释放事务锁资源。

ROLLBACK

取消当前事务作业,撤销最近的COMMIT或者ROLLBACK开始所做的更改。ROLLBACK TO SAVEPOINT语句会丢弃自最近的保存点开始的更改,但并不结束整个事务。

SAVEPOINT

在事务中设置一个保存点用于以后回滚操作。

COMMIT语句

说明:

COMMIT语句结束当前的事务,并使得所有的更改持久化以及对所有的用户可见。

示例:

--  清理环境
DROP TABLE tab CASCADE;
DROP PROCEDURE proc;

create table tab(a int);

CREATE OR REPLACE PROCEDURE proc AS
BEGIN
    begin
        insert into tab values(1);
        commit;
    end;
    begin
        insert into tab values(2);
    end;
    insert into tab values(3);
    commit;
    delete from tab where a=2;
END;

/

exec proc;

--删除过程
DROP PROCEDURE proc;
DROP TABLE tab CASCADE;

ROLLBACKT语句

说明:

ROLLBACK语句结束当前的事务并撤销此事务所作的任何更改。如果出现错误,比如错误的删除了表中的数据,ROLLBACK语句可以恢复原始数据。如果因为SQL语句执行失败或者PLOSCAR语句抛出异常,ROLLBACK语句可以矫正错误,可能会重新开始。

示例:

--  清理环境
DROP TABLE tab CASCADE;
DROP PROCEDURE proc;

create table tab(a int);

CREATE OR REPLACE PROCEDURE proc AS
BEGIN
    DELETE FROM tab;
    INSERT INTO tab VALUES(110);
    SAVEPOINT DO_INSERT10;
    INSERT INTO tab VALUES(111);
    ROLLBACK TO DO_INSERT10;
END;
/

--存储过程 + 关闭自动提交
SET AUTOCOMMIT=OFF;

EXEC proc;
COMMIT;

SET AUTOCOMMIT=ON;

--插入1条: 110
SELECT * FROM tab;
A(int)      |
------------
110         |
总数目:1

--删除过程
DROP PROCEDURE proc;
DROP TABLE tab CASCADE;

SAVEPOINT语句

说明:

SAVEPOINT语句命名并标记当前事务所处理的状态点。该语句可以回滚部分事务而不是全部事务。对于每个会话中有效保存点的数目没有限制。

当回滚到一个保存点时,在此保存之后所设置的保存点将会全部擦除,此保存点之前的保存点将保持不变。简单的ROLLBACK或者COMMIT语句将擦除所有的保存点。

如果将保存点设置在递归程序中,那么对于递归的每次下限都会创建一个新的保存点实例,但是回滚语句只能回滚到最近标记的保存点。

保存点名称是未声明的标识符。在事务中重新使用保存点名称将会使保存点从原有的位置移动到当前位置,此时ROLLBACK到此保存点只会影响到事务的当前部分。

示例:

--  清理环境
DROP TABLE tab CASCADE;
DROP PROCEDURE proc;

create table tab(a int);

CREATE OR REPLACE PROCEDURE proc AS
BEGIN
    DELETE FROM tab;
    INSERT INTO tab VALUES(120);
    SAVEPOINT DO_INSERT120;
    INSERT INTO tab VALUES(121);
    SAVEPOINT DO_INSERT120;
    INSERT INTO tab VALUES(122);
    ROLLBACK TO DO_INSERT120;
END;

/

EXEC proc;

--插入2条: 120, 121
SELECT * FROM tab;
A(int)      |
------------
120         |
------------
121         |
总数目:2

--删除过程
DROP PROCEDURE proc;
DROP TABLE tab CASCADE;