- 浏览: 137949 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (52)
- oracle linux R6-U2-server-i386 (8)
- oracleDBA (25)
- 虚拟机-vmware-8.0.2 (2)
- linux-ubuntu (0)
- oracle背景资料 (28)
- DOS (3)
- sql常用操作 (2)
- win7/XP/03/08/2K/ (1)
- NT系统优化 (2)
- 网络 (1)
- 安全 (0)
- 乌七杂八资料库 (23)
- 个人心情 (2)
- ESXI 4.1 (1)
- vsphere5.0 (4)
- rac (3)
- oracle linux R6-U2-server-i386,oracle9204 (2)
- 条件处理符号 (1)
- 批处理 (2)
最新评论
-
yexiaochong:
我从头到尾看完了。写得也挺有道理的。我也类似你一样。花了不止两 ...
工作意向及规划个人建议 -
netkiller.github.com:
写的真多,实在看不下去了,支持一下
工作意向及规划个人建议
原文地址:
http://www.2cto.com/database/201209/155881.html
作者:foreverfeng
文章解释不错,转载一下,作为个人资料学习库。晓得DDL是oracle为了增强并发性和减少锁的产生,就OK了。
在ITPUB上看到有人提出了这个问题。在Sqlserver或一些其他的数据库中,DDL语句也是可以回滚的,那么Oracle为什么不能回滚DDL语句呢。
这个问题来自:http://www.itpub.net/thread-1300088-1-5.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是为了将用户的读写操作和数据字典的修改隔离开,用户数据的读写不应该和数据字典的操作放在同一个事务中。
www.2cto.com
为了说明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不将行锁升级为表锁,可能其他的因素也会导致这种情况的发生。
http://www.2cto.com/database/201209/155881.html
作者:foreverfeng
文章解释不错,转载一下,作为个人资料学习库。晓得DDL是oracle为了增强并发性和减少锁的产生,就OK了。
在ITPUB上看到有人提出了这个问题。在Sqlserver或一些其他的数据库中,DDL语句也是可以回滚的,那么Oracle为什么不能回滚DDL语句呢。
这个问题来自:http://www.itpub.net/thread-1300088-1-5.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是为了将用户的读写操作和数据字典的修改隔离开,用户数据的读写不应该和数据字典的操作放在同一个事务中。
www.2cto.com
为了说明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不将行锁升级为表锁,可能其他的因素也会导致这种情况的发生。
发表评论
-
oracle 10g 使用expdp network_link导出远程数据库到本地文件 【转载】
2012-12-11 13:45 5407文章不错,解除疑惑,oracle10G0204可以实现远程导入 ... -
No startup acknowledgement from forked process after 30 seconds
2012-11-22 11:20 1699摘抄2篇文章。都是这个问题的描述,结果都是没有办法解决,直接重 ... -
oracle在linux下安装遇到的所有的问题总结说明(3)
2012-10-30 15:48 1312大部分内容为已经遇到过的问题解决方案,基本都是谷歌出来的,留下 ... -
oracle on linux非官方做法遇到的问题集锦(1)
2012-10-30 15:44 17471、安装oracle linux 6.2创 ... -
oracle在linux下安装遇到的所有的问题总结说明(2)(20121122修改)
2012-10-30 15:35 2095安装的时候遇到的问题说明(部分内容 ... -
oracle在linux下安装遇到的所有的问题总结说明(1)
2012-10-30 15:31 1330安装oracle 官方文档,翻译说明( ... -
过大的Oracle监听日志文件处理(转载)
2012-10-15 12:53 2025过大的Oracle监听日志文件处理 2011-03-11 10 ... -
.【转载】oracle物化视图的一般用法
2012-08-29 10:45 908本文转载自乔文《oracle ... -
ora-12542 address in used(转载)
2012-06-16 16:51 1603转载的,原作者网址:http://space.itpub.ne ... -
EXP-00091 Exporting questionable statistics
2012-06-15 20:02 1198http://space.itpub.net/trackbac ... -
《转载》oracle绑定变量详解
2012-05-11 10:18 855原文转载自linuxg公社 http://www.linuxi ... -
oracle9I坏块错误
2012-05-10 18:41 858在一个客户的9201 for Windows数据库中发现了 ... -
《转载》ora-00020超出最大进程数
2012-05-10 18:42 994纯属学习查询资料,没什么说的,当资料了,感谢作者,转载无罪 ... -
《转载》oracle1000问
2012-05-10 18:42 764没什么说的,比较适合初学者的,呵呵,一块学习吧。 -
《转载》韩顺平-玩转oracle视频教材笔记(文档)
2012-05-10 18:42 1004转载的,那下载的,忘了,全名叫oracle10G从入门到精 ... -
ora-27100shared memory realm already exists(20120529修改)
2012-05-10 18:42 2284这个问题一般情况下,是因为调整内存参数的时候出现问题了,而且数 ... -
FATAL ERROR IN TWO-TASK SERVER: error = 12571
2012-05-11 10:18 1203这个问题貌似是因为应用程序和数据库在连接的时候出现各种意外 ... -
ora-12516监听程序找不到符合协议堆栈要求的可用处理程
2012-05-11 10:19 10028oracle服务器上某个数据库出现' ORA-12516: T ... -
ora-02095无法修改指定的初始化参数
2012-05-11 10:19 19142说个题外话,话说我在查找一些oracle报错的时候,最容易 ... -
ora-01261错误解析
2012-05-11 10:19 2036ORA-01261: Parameter string des ...
相关推荐
【回滚段】是Oracle数据库管理系统中的一个重要组成部分,主要用于存储数据修改前的状态,确保事务的回滚、恢复和读一致性。在Oracle 8i及更早版本中,回滚段的管理尤其关键。 **一、回滚段的作用** 1. **事务回滚...
在Oracle中,DDL包括以下命令: 1. **CREATE**: 用于创建新的数据库对象,如表、视图、索引、存储过程、用户等。 2. **ALTER**: 修改已存在的对象结构,如增加或删除字段,更改表空间等。 3. **DROP**: 删除不再...
### Oracle DDL、DML、DCL、TCL 基础概念 ...通过以上介绍,我们可以看到 Oracle 数据库中 DDL、DML、DCL 和 TCL 这四种语言的基本概念及其使用方法。掌握这些基础知识对于有效地管理和操作 Oracle 数据库至关重要。
4. `TRUNCATE`:快速删除表中的所有数据,但不记录在事务日志中,因此无法回滚。与`DELETE`相比,它执行速度快,且不触发表的触发器。 DML,全称为Data Manipulation Language,专注于对数据库中已有数据的修改。...
在实际的业务环境中,由于各种原因,如系统升级、合并或技术选型的变化,有时我们需要将数据从MySQL迁移到Oracle,或者反之。这时,“mysql-oracle数据转换工具”就显得尤为关键。 该工具的核心功能是实现数据的...
4. **兼容性和版本问题**:`EXECUTE IMMEDIATE`在不同的Oracle版本中可能有不同的行为。例如,在早期版本的Forms和PL/SQL中,可能需要特定的语法来支持`EXECUTE IMMEDIATE`。随着版本的演进,如在Oracle Forms 6i及...
`TRUNCATE`作为DDL操作,仅改变数据文件中的高水位线(HWM),不使用回滚段,执行速度快;而`DELETE`作为DML操作,需经过回滚处理,消耗资源更多,执行时间较长。 ### 8. 索引的重要性 索引在Oracle数据库中扮演着...
Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,尤其在企业级应用中占据着重要地位。本资源“Oracle入门学习资料精华”是为初学者精心准备的一套学习材料,旨在帮助新接触Oracle的人员逐步掌握这个...
在Oracle数据库管理中,SQL(结构化...总之,Oracle SQL的熟练掌握是数据库开发和管理的基础,而对常见问题的了解和解决能力,则能有效提升工作效率和系统的稳定性。通过不断实践和学习,可以更好地驾驭Oracle数据库。
### Oracle 锁机制问题详解 #### 一、引言 在多用户数据库环境中,当多个用户尝试同时访问或修改同一份数据时,就需要通过锁机制来确保数据的一致性和完整性。Oracle 数据库提供了多种类型的锁来支持事务隔离级别,...
8. **源码实战**:随书附带的源码可以帮助读者更好地理解和应用所学知识,通过实际操作加深对Oracle SQL的理解,并解决实际工作中的问题。 综上所述,《精通Oracle SQL(第2版)》是一本全面覆盖Oracle SQL的指南,...
ORACLE数据库锁表问题浅析 Oracle数据库锁机制是企业级数据库管理系统中一个非常重要的机制。锁机制的主要目的是为了保证数据的一致性和正确性,在多用户同时访问数据库时,避免数据的不一致和错误。Oracle数据库锁...
需要注意的是,与SQL Server和Sybase等其他数据库系统相比,Oracle中不应在运行时动态创建临时表,而应在应用程序安装时创建。DDL操作(如创建表)开销较大,应尽量避免在运行时执行。 总结来说,Oracle的临时表...
例如,delete操作可以回滚,可能造成数据碎片,而truncate操作不能回滚,但会立即释放空间。 在数据库备份方面,文档提供了Oracle数据库的导出与导入命令。整库导出可以通过“exp”命令实现,参数“full=y”表示...
Oracle面试技术篇涵盖了许多核心概念,对于准备Oracle数据库面试的人来说非常关键。以下是对这些知识点的详细解释: ...掌握这些面试问题的答案,有助于在Oracle数据库相关的职位面试中表现出色。
在Oracle 11g的环境下,cx_Oracle 的使用尤其关键,因为它确保了Python代码能与Oracle数据库进行高效且可靠的通信。 cx_Oracle-5.1.2-11g.win-amd64-py2.7.msi 和 cx_Oracle-5.1.2-11g.win32-py2.7.msi 是cx_Oracle...
"Oracle+Concepts中英文对照版(10g+R2).chm"文件很可能包含了所有这些概念的详细解释,包括但不限于数据库设计、备份与恢复、网络配置、性能监控等,是学习Oracle数据库的宝贵资源。无论是初学者还是经验丰富的DBA,...
数据定义语言(DDL)在Oracle中用于创建和修改数据库对象,如表、视图、索引等。学习DDL,你需要掌握CREATE TABLE语句来创建新表,ALTER TABLE用于修改已有表结构,DROP TABLE删除表,以及CREATE INDEX建立索引等。 ...