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

时间:2019-05-19 09:50:20

标签: database oracle commit ddl dml

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

这就是我所做的:

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

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

  3. 向表1中插入了更多数据。

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

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

1 个答案:

答案 0 :(得分:5)

DML默认情况下未提交。

  

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

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

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

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

此外,SQL * Plus将在退出时提交行,无论是通过连接到新会话还是键入exit(但不是通过不受控制的退出,例如通过Task Manager杀死客户端进程)。由于Oracle 11gR2,这种行为可以通过the EXITCOMMIT system variable进行配置。默认值为ON。


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