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

J.D*_*Doe 2 oracle plsql transactions oracle11g

我将从 SQL Server 迁移到 Oracle。我发现的一件事是,Oracle 自动提交默认是禁用的。我的问题是,当自动提交打开时,我们如何回滚事务?在SQL Server中,有这样的Begin tran语句,那么Oracle呢?

APC*_*APC 7

Oracle 中没有类似的东西begin tran

当我们第一次运行某些 DML 时,Oracle 会隐式启动一个事务。事务会一直持续到我们发出 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;
/
Run Code Online (Sandbox Code Playgroud)

如果我们要在带有 AUTOCOMMIT 的客户端中运行此块,则会插入零条记录。自动提交在执行级别运行,在本例中是块:要么整体成功并提交,要么失败但不提交。因此,第五次插入未能通过主键验证会触发前四次插入的回滚。

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


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

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