【问题标题】:Why DML commands executed before and after a DDL command are auto committed?为什么在 DDL 命令之前和之后执行的 DML 命令会自动提交?
【发布时间】:2019-10-05 23:31:17
【问题描述】:

我知道 DDL 命令是自动提交的,但为什么是 DML 命令?

这就是我所做的:

  1. 已将数据插入到名为 table1 的现有表中。

  2. 创建了一个名为 table2 的表。

  3. 在 table1 中插入了更多数据。

在我退出并再次登录后,在步骤 1 和 3 中输入的数据仍然存在,而无需我进行任何明确的提交。

为什么在这种情况下会自动提交 DML 命令?

【问题讨论】:

    标签: database oracle commit ddl dml


    【解决方案1】:

    默认情况下不提交 DML。

    在步骤 1 和 3 中输入的数据会持续存在,而无需我进行任何明确的提交

    当您在步骤 2 中执行 CREATE TABLE 语句时,已提交步骤 1 中插入的记录。您知道 Oracle 中的 DDL 命令会在执行 DDL 之前和之后发出提交,因此您不应该对打开的事务感到惊讶创建表时提交。

    第 3 步中数据的提交是不同的。我再次重申,DML 不会在 Oracle 中自动提交。但是,我们用来连接数据库的客户端软件通常可以配置为在每条语句之后发出提交。

    例如,Autocommit 是 TOAD 和 PL/SQL Developer 等 IDE 中的一个选项。如果您使用此类工具,请检查 Tools > Preferences 以获取 the pertinent setting(具体路径可能因特定产品而异)。 JDBC 连接auto-commit by default。与 Microsoft ODBC 相同。 SQL*Plus 默认有 AUTOCOMMIT = OFF,但可以设置为 ON。

    此外,SQL*Plus 将在退出时提交行,无论是通过连接到新会话还是键入 exit(但不是通过不受控制的退出,例如通过任务管理器终止客户端进程)。由于 Oracle 11gR2 这种行为可以通过the EXITCOMMIT system variable 进行配置;默认为开启。


    这里是a db<>fiddle demo,它演示了在提交 DDL 语句之前的 DML,但是 - 在 AUTOCOMMIT 关闭的客户端中 - 可以回滚语句之后的 DML。

    【讨论】:

    • 看来您对 EXITCOMMIT 变量是正确的。当我在没有“退出”命令的情况下关闭 SQLPLUS 命令行窗口时,数据没有保存。但是当我使用退出命令关闭它时,数据会被保存。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2018-09-11
    • 2017-03-28
    • 2016-01-02
    • 2018-10-12
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多