database - 为什么自动提交 DDL 命令前后执行的 DML 命令?
问题描述
我知道 DDL 命令是自动提交的,但为什么是 DML 命令?
这就是我所做的:
将数据插入到已存在的名为 table1 的表中。
创建了一个名为 table2 的表。
在 table1 中插入了更多数据。
在我退出并再次登录后,在步骤一和三中输入的数据仍然存在,而我无需给出任何明确的提交。
为什么在这种情况下会自动提交 DML 命令?
解决方案
默认情况下不提交 DML。
在步骤 1 和 3 中输入的数据保持不变,无需我给出任何明确的提交
当您在步骤 2 中执行 CREATE TABLE 语句时,在步骤 1 中插入的记录已提交。您知道 Oracle 中的 DDL 命令在执行 DDL 之前和之后都会发出提交,因此当您提交打开的事务时,您应该不会感到惊讶。创建一个表。
来自步骤 3 的数据的提交是不同的。我再次重申,DML 不会在 Oracle 中自动提交。但是,我们用来连接数据库的客户端软件通常可以配置为在每条语句之后发出提交。
例如,Autocommit
是 TOAD 和 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。
推荐阅读
- awk - 如果pattern匹配两行,如何融合两行的信息?
- javascript - React Javascript,在未定义的数组中找到并跳过它
- android-studio - Android 工作室,gradle 分发
- python - 调度 Discord Python 任务
- mysql - mysql中2个值的除法
- python - main() 在运行启动文件时创建未定义的错误
- python - 有条件求和列表
- javascript - JavaScript、PHP - 使用 AJAX 的错误消息
- r - Anaconda R 和 R 基金会的 R 有什么区别?
- unix - tSytsem 组件转义字符问题