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



我要从SQL Server转到Oracle。我发现,在Oracle中,自动提交在默认情况下是禁用的。我的问题是,当启用自动提交时,我们如何回滚事务?在SQL Server中,有Begin tran语句,那么Oracle呢?

Oracle中没有等效的begin tran

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

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

但是,为了回答这个问题:Autocommit在语句级别进行提交。因此,无法回滚单个成功完成的事务。因此,如果您希望在一个事务中包含多个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的客户端中运行这个块,它将插入零条记录。Autocommit在执行级别运行,在本例中是块:要么整个成功并提交,要么失败但未提交。因此,第五个插入未能通过主键验证会触发前四个插入的回滚。

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


那么这个选项是关于什么的呢?:tools -preferences - database - advance - autocommit checkbox

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

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

最新更新