【问题标题】:Begin transaction in Oracle - rollback in autocommit在 Oracle 中开始事务 - 在自动提交中回滚
【发布时间】:2019-04-23 22:19:59
【问题描述】:

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

【问题讨论】:

  • 不能在 PL/SQL 中关闭自动提交
  • 是的,你可以,只需转到工具 - 首选项 - 数据库 - 高级,那里有自动提交复选框。
  • 这不是“PL/SQL”——这是您正在使用的 SQL 客户端中的一些自动提交设置(另外它可能只影响 SQL,而不影响 PL/SQL)
  • 它会影响 DML 语句,所以它正在做这项工作
  • 一些演示问题的 PL/SQL 代码示例会有很大帮助。

标签: oracle plsql oracle11g transactions


【解决方案1】:

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

【讨论】:

  • 我知道整个区块会因为这五分之一行而失败,这就是交易点,不是吗?这就是我问我的问题的原因
  • @johndoe - 唉,那么你的问题还不清楚。我以为你问的是当你的客户端在自动提交模式下运行时回滚是如何工作的。
  • @J.Doe 所以你的问题是如何回滚 PL/SQL 块内的自动提交,即使 PL/SQL 没有自动提交?
  • 现在我很困惑,那么这个选项到底是什么意思?:工具 - 首选项 - 数据库 - 高级 - 自动提交复选框
【解决方案2】:

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

请同时阅读 - 因为不是每个人都知道 DDL 命令隐式提交 - 所有什么 在提交任何 DDL 语句之前完成: https://docs.oracle.com/cd/A57673_01/DOC/api/doc/PC_22/ch08.htm#toc103

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2012-09-17
    相关资源
    最近更新 更多