在Oracle中开始事务-自动提交中的回滚

时间:2018-11-21 10:51:28

标签: oracle plsql oracle11g transactions

我正在从SQL Server迁移到Oracle,我发现默认情况下在Oracle中自动提交是禁用的,但是我的问题是,在打开自动提交时我们如何回滚事务?在SQL Server中,有Begin tran条语句,Oracle呢?

2 个答案:

答案 0 :(得分:3)

Oracle中没有begin tran的等效项。

Oracle在我们第一次运行某些DML时隐式启动事务。交易一直进行到我们发出COMMIT或ROLLBACK为止。请注意,在Oracle DDL命令中,在执行之前和之后都会发出隐式提交。因此,我们不仅不能回滚CREATE TABLE语句,而且不能回滚在该CREATE TABLE语句之前执行的任何DML语句。

在我的书中,自动提交是一种反模式:事务是工作单元,除了最琐碎的应用程序外,它是一系列语句。在每个语句之后进行提交会导致不一致,不可恢复和(可能)数据损坏。

但是,要回答这个问题:自动提交在语句级别提交。因此,没有办法回滚单个成功完成的事务。因此,如果要将多个DML语句合并到一个事务中,并且有可能回滚不完整的工作单元,则需要将这些语句分组在PL / SQL块中。

在这里,我们有一个PL / SQL块,可以在单个语句中插入一些记录。

begin
    insert into t23 (id) values (1);
    insert into t23 (id) values (2);
    insert into t23 (id) values (3);
    insert into t23 (id) values (4);
    insert into t23 (id) values (1);
exception
    when dup_val_on_index then
        rollback;
        raise;
end;
/

如果我们要在带有AUTOCOMMIT的客户端中运行此块,它将插入零条记录。自动提交在执行级别进行操作,在这种情况下,执行级别是块:要么整体成功并提交,要么整体失败而不是失败。因此,第五次插入未能通过主键验证会触发前四个插入的回滚。

请注意,即使没有异常处理程序中的显式回滚,四个插入也会回滚。阻止失败,未提交事务。


  

那么,此选项的全部用途是什么?:tools -preferences - database - advance - autocommit checkbox

这是来自客户端IDE(Oracle SQL Developer?)的菜单路径。 AUTOCOMMIT是一个客户端选项,在客户端执行的每条语句之后都会发出提交。

答案 1 :(得分:0)

Oracle本身没有自动提交,请调整您的工具并使用begin exception end; : https://asktom.oracle.com/pls/apex/f?p=100:11:0%3A%3A%3A%3AP11_QUESTION_ID:314816776423

请同时阅读-并非所有人都知道DDL命令是隐式提交的-所有 在提交ANy DDL语句之前完成: https://docs.oracle.com/cd/A57673_01/DOC/api/doc/PC_22/ch08.htm#toc103