首页 > 解决方案 > 在 Oracle 中开始事务 - 在自动提交中回滚

问题描述

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

标签: oracleplsqloracle11gtransactions

解决方案


begin tran在 Oracle中没有等价物。

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 是一个客户端选项,它在客户端执行的每个语句之后发出一个提交。


推荐阅读