为什么在 DDL 命令之前和之后执行的 DML 命令会自动提交?

Why DML commands executed before and after a DDL command are auto committed?

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

这是我所做的:

  1. 已将数据插入到名为 table1.

  2. 的现有 table 中
  3. 创建了一个名为 table2 的 table。

  4. 向 table1.

  5. 中插入了更多数据

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

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

默认情况下不提交 DML。

the data entered in the steps one and three persisted without me having to give any explicit commit

当您在步骤 2 中执行 CREATE TABLE 语句时,步骤 1 中插入的记录已提交。您知道 Oracle 中的 DDL 命令在执行 DDL 之前和之后发出提交,因此您不应该惊讶于当您创建 table.

时提交了一个打开的事务

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

例如,Autocommit 是像 TOAD 和 PL/SQL Developer 这样的 IDE 中的一个选项。如果您使用此类工具,请检查 Tools > Preferences for the pertinent setting (exact path may vary for a specific product). JDBC connections auto-commit by default。与 Microsoft ODBC 相同。 SQL*Plus 默认情况下 AUTOCOMMIT = OFF,但可以将其设置为 ON。

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


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