DDL操作前后都有COMMIT
引用出处: http://www.itpub.net/thread-1746448-1-1.html
要说明这个问题,首先需要说明什么是DDL语句。DDL语句是数据定义语句,包括各种数据对象的创建、修改和删除,以及授权等操作。
在Oracle中DDL语句将转化为修改数据字典表的DML语句。一个简单的修改表的DDL语句,会导致Oracle在后台通过递归SQL语句进行大量的查询和修改的操作。
如果有兴趣,可以通过SQL_TRACE根据一下DDL语句,检查一下Oracle后台实际执行了哪些操作。
在Oracle中,Oracle执行DDL前会发出一个COMMIT语句,然后执行DDL操作,最后再发出一个COMMIT操作。
前面提到了对于Oracle而言,DDL实际上是数据字典表的一系列的修改,也就是数据字典表的DML操作,那么理论上讲Oracle是完全有能力实现DDL语句的回滚的,那么Oracle为什么设计成现在的工作方式。要知道Oracle以灵活和强大的可定制性著称,但是Oracle没有给用户任何回滚DDL的可能性,显示是存在着十分充分的理由。
首先分析一下Oracle为什么要在DDL语句之前和之后各执行一次COMMIT,其实道理很简单,Oracle是为了将用户的读写操作和数据字典的修改隔离开,用户数据的读写不应该和数据字典的操作放在同一个事务中。
为了说明Oracle为什么不回滚DDL语句,下面假设Oracle可以回滚DDL语句,看看这会给Oracle数据库带来什么影响。
从现在开始,假设DDL并不会自动提交,而是事务中的一部分。
那么DDL就要满足READ COMMIT隔离机制,也就是说,用户执行的DDL语句在提交前,其他用户是无法看到的。比如A用户执行CREATE TABLE T的语句,然后对T执行了一些DML。而这时其他会话是无法看到T表的。
那么考虑这样的情况,存在表T,包含两个列,一个ID列,一个CREATED列。
A会话执行了ALTER TABLE T MODIFY CREATED DEFAULT SYSDATE NOT NULL,然后对T表进行了一些插入,但是没有提交。
这时B会话尝试插入T表,如果DDL语句不是事务的一部分,那么B的插入和A会话的插入之间没有冲突,但是现在情况不同,由于A执行了T表的修改,为CREATED列增加了默认值并设置为NOT NULL,而且这个修改B会话当前是看不到的,因为A并没有提交修改。这时如果B会话的插入没有提供CREATED列的值,则插入操作将被锁定。对于B而言,表结构中CREATED列仍然是可空的,因此允许插入CREATED列为空的记录,但是由于A已经设置T的CREATED列非空,且包含默认值,因此B的插入必须被锁定,否则如果A和B全部提交,A会话会发现即使执行了DDL语句,T表中仍然存在CREATED为空的记录。Oracle为了实现DDL可以回滚的功能,且实现多版本读一致性,那么就必须在DDL发生后,将修改的表锁定,避免其他会话的访问造成不一致。这会导致Oracle中出现锁升级的情况,并且严重的影响Oracle的并发性,而且会大大增加死锁产生的几率。
也许有人奇怪SQLSERVER或一些其他的数据库为什么可以实现DDL语句的回滚。事实上,前面提到了Oracle也是有能力实现DDL回滚的,只是这会极大的影响Oracle的并发性。要知道,Oracle的锁机制和多版本读一致性使得Oracle的并发性在所有数据库产品中首屈一指。显然为了实现DDL的回滚而损失最值得称道的并发性,Oracle认为得不偿失。其他数据库之所以可以实现,是因为这些数据库的锁机制本身就存在一定缺陷,比如大量的锁会占用系统的资源、读写操作互相阻塞、行级锁可能自动升级为表级锁。由于已经存在这些问题,所以实现DDL的回滚并不会在很大程度上使得并发性恶化,因为即使DDL不将行锁升级为表锁,可能其他的因素也会导致这种情况的发生。
DDL操作前后都有COMMIT的更多相关文章
- MySQL--各版本DDL 操作总结
MySQL 5.5 DDL 在MySQL 5.5版本前,所有DDL操作都使用Copy Table的方式完成,操作过程中原表数据库不允许写入,只能读取,在MySQL 5.5版本中引入FIC(Fast i ...
- 【科普】MySQL中DDL操作背后的并发原理
一. 简介 DQL:指数据库中的查询(select)操作. DML:指数据库中的插入(insert).更新(update).删除(delete)等行数据变更操作. DDL:指数据库中加列(add co ...
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- 数据库级别DDL操作监控审计、数据库触发器/服务器触发器
关键词:数据库触发器/服务器触发器 ,数据库级别DDL操作监控审计,禁止修改登录名密码 [1]数据库级别DDL操作监控审计 转自2012示例库,只能数据库级别,不能实例级别 use database ...
- Hive学习笔记(三)-- DML和DDL操作
01-Hive表的DDL操作--修改表 创建一个分区表并加载数据 查询数据 修改表 加载数据 查询一下 另外一个命令查询表的分区 如何删除一个分区呢 查询一个,分区被删除了 修改表名 查询改名的新表的 ...
- Hive数据类型和DDL操作
hive命令 在Linux下的命令行中直接输入如下命令,可以查看帮助信息: # hive -help 常用的如-e.-f参数. 使用-e参数,可以直接在命令行传递SQL语句进行hive表数据的查询: ...
- MySQL DDL--MySQL 5.7版本Online DDL操作
主键索引维护 1.新增主键索引 ## 可以使用ALGORITHM=INPLACE+LOCK=NONE方式,操作期间允许读写. ALTER TABLE tb001 ADD PRIMARY KEY (ID ...
- 监控数据库DDL操作日志
背景 为了监控好生产环境下各个数据库服务器上DDL操作日志,便于运维工程师管控好风险,我们有必要关注当前实例下的所有的DDL操作以及对应的IP和hostname. 测试环境 Microsoft SQL ...
- GaussDB(DWS)应用实战:对被视图引用的表进行DDL操作
摘要:GaussDB(DWS)是从Postgres演进过来的,像Postgres一样,如果表被视图引用的话,特定场景下,部分DDL操作是不能直接执行的. 背景说明 GaussDB(DWS)是从Post ...
随机推荐
- C# Process 类的思考
在这里,我先给自己留个印象 下面我们用C#实现一个调用Dos命令的小程序,让大家对系统进程能有个直观的了解.要使用Process类,首先要引入System.Diagnostic命名空间,然后定义一个新 ...
- ios开发——实用技术篇OC篇&获取内存使用情况
获取内存使用情况 iOS 获取 当前设备 可用内存 及当前 应用 所占内存 (-- ::) 转载 ▼ 标签: ios 设备 可用内存 所占内存 内存 it 分类: iOS // 获取当前设备可用内存及 ...
- .net平台下C#socket通信(转)
上篇.net平台下C#socket通信(上)介绍了socket通信的基本原理及最基本的通信方式.本文在此基础上就socket通信时经常遇到的问题做一个简单总结,都是项目中的一些小问题,拿来此处便于下次 ...
- UWSGI安装与使用
http://blog.csdn.net/chenggong2dm/article/details/43937433 http://blog.csdn.net/orangleliu/article/d ...
- MYSQL内存--------启动mysql缓存机制,实现命中率100% 转
虽然这个标题夸张得过了头,但此文很完整,值得学习.转自 http://www.yy520.net/read.php?278 myql优化,启动MySQL缓存机制,实现命中率100% 配置你的mysql ...
- How to Display Image In Picturebox in VC++ from Iplimage and Mat
Introduction This tip/trick will be useful to OpenCV programmers, who wish to use Windows Form appli ...
- Asp.Net下载页面,并弹出下载提示框
Asp.Net下载页面,并弹出下载提示框.在删除按钮里调用以下方法.
- PHP.4-DIV+CSS标准网页布局准备工作(下)
DIV+CSS标准网页布局准备工作 区块属性(区块模型) 属 性 描 述 Margin(注) 是定义区块外边界与上级元素距离的属性,用1到4个值来设置元素的边界,每个值都是长度.百分比或者auto,百 ...
- Android(java)学习笔记80:UDP协议发送数据
UDP协议发送数据:我们总是先运行接收端,再运行发送端发送端: 1 package cn.itcast_02; import java.io.IOException; import java.net. ...
- 前端必会html知识整理
1.浏览器内核: 1.ie:trident(三叉戟)内核 2.firefox:gecko(壁虎)内核 3.safari:webkit(浏览器核心)内核 ...