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