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

Kal*_*ran 1 database oracle ddl commit dml

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

这是我所做的:

  1. 将数据插入到已经存在的名为table1的表中。

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

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

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

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

APC*_*APC 5

默认情况下不提交DML。

在第一和第三步中输入的数据仍然存在,而无需我进行任何明确的提交

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

来自步骤3的数据提交不同。我再说一遍,DML不是在Oracle中自动提交的。但是,通常可以将我们用于连接数据库的客户端软件配置为在每个语句之后发出提交。

例如,AutocommitTOIDE和PL / SQL Developer等IDE中的一个选项。如果使用这样的工具检查Tools> Preferences相关设置(准确的路径可以为特定产品而异)。JDBC连接默认自动提交。与Microsoft ODBC相同。SQL * Plus默认情况下具有AUTOCOMMIT = OFF,但是可以将其设置为ON。

而且,SQL * Plus会在退出时提交行,无论是通过连接到新会话还是键入exit(而不是通过不受控制的退出,例如通过Task Manager杀死客户端进程)。由于Oracle 11gR2,这种行为可以通过EXITCOMMIT系统变量进行配置。默认为开。


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