`

oracle中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数据库管理系统中的一个重要组成部分,主要用于存储数据修改前的状态,确保事务的回滚、恢复和读一致性。在Oracle 8i及更早版本中,回滚段的管理尤其关键。 **一、回滚段的作用** 1. **事务回滚...

    oracle-DDL-DML-DCL-TCL.rar_The Oracle

    在Oracle中,DDL包括以下命令: 1. **CREATE**: 用于创建新的数据库对象,如表、视图、索引、存储过程、用户等。 2. **ALTER**: 修改已存在的对象结构,如增加或删除字段,更改表空间等。 3. **DROP**: 删除不再...

    Oracle DDL,DML,DCL,TCL 基础概念

    ### Oracle DDL、DML、DCL、TCL 基础概念 ...通过以上介绍,我们可以看到 Oracle 数据库中 DDL、DML、DCL 和 TCL 这四种语言的基本概念及其使用方法。掌握这些基础知识对于有效地管理和操作 Oracle 数据库至关重要。

    DDL与DML详解

    4. `TRUNCATE`:快速删除表中的所有数据,但不记录在事务日志中,因此无法回滚。与`DELETE`相比,它执行速度快,且不触发表的触发器。 DML,全称为Data Manipulation Language,专注于对数据库中已有数据的修改。...

    mysql-oracle数据转换工具

    在实际的业务环境中,由于各种原因,如系统升级、合并或技术选型的变化,有时我们需要将数据从MySQL迁移到Oracle,或者反之。这时,“mysql-oracle数据转换工具”就显得尤为关键。 该工具的核心功能是实现数据的...

    Oracle中EXECUTE IMMEDIATE用法

    4. **兼容性和版本问题**:`EXECUTE IMMEDIATE`在不同的Oracle版本中可能有不同的行为。例如,在早期版本的Forms和PL/SQL中,可能需要特定的语法来支持`EXECUTE IMMEDIATE`。随着版本的演进,如在Oracle Forms 6i及...

    讲解Oracle面试过程中常见的二十个问题

    `TRUNCATE`作为DDL操作,仅改变数据文件中的高水位线(HWM),不使用回滚段,执行速度快;而`DELETE`作为DML操作,需经过回滚处理,消耗资源更多,执行时间较长。 ### 8. 索引的重要性 索引在Oracle数据库中扮演着...

    Oracle入门学习资料精华

    Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,尤其在企业级应用中占据着重要地位。本资源“Oracle入门学习资料精华”是为初学者精心准备的一套学习材料,旨在帮助新接触Oracle的人员逐步掌握这个...

    oracle 常用sql语句和常见问题

    在Oracle数据库管理中,SQL(结构化...总之,Oracle SQL的熟练掌握是数据库开发和管理的基础,而对常见问题的了解和解决能力,则能有效提升工作效率和系统的稳定性。通过不断实践和学习,可以更好地驾驭Oracle数据库。

    精通Oracle_SQL(第2版)含源码

    8. **源码实战**:随书附带的源码可以帮助读者更好地理解和应用所学知识,通过实际操作加深对Oracle SQL的理解,并解决实际工作中的问题。 综上所述,《精通Oracle SQL(第2版)》是一本全面覆盖Oracle SQL的指南,...

    Oracle 锁机制问题详解

    ### Oracle 锁机制问题详解 #### 一、引言 在多用户数据库环境中,当多个用户尝试同时访问或修改同一份数据时,就需要通过锁机制来确保数据的一致性和完整性。Oracle 数据库提供了多种类型的锁来支持事务隔离级别,...

    ORACLE数据库锁表问题浅析.pdf

    ORACLE数据库锁表问题浅析 Oracle数据库锁机制是企业级数据库管理系统中一个非常重要的机制。锁机制的主要目的是为了保证数据的一致性和正确性,在多用户同时访问数据库时,避免数据的不一致和错误。Oracle数据库锁...

    ORACLE中临时表

    需要注意的是,与SQL Server和Sybase等其他数据库系统相比,Oracle中不应在运行时动态创建临时表,而应在应用程序安装时创建。DDL操作(如创建表)开销较大,应尽量避免在运行时执行。 总结来说,Oracle的临时表...

    oracle数据库从入门到精通.pdf

    例如,delete操作可以回滚,可能造成数据碎片,而truncate操作不能回滚,但会立即释放空间。 在数据库备份方面,文档提供了Oracle数据库的导出与导入命令。整库导出可以通过“exp”命令实现,参数“full=y”表示...

    oracle面试问题技术篇

    Oracle面试技术篇涵盖了许多核心概念,对于准备Oracle数据库面试的人来说非常关键。以下是对这些知识点的详细解释: ...掌握这些面试问题的答案,有助于在Oracle数据库相关的职位面试中表现出色。

    python2.7_cx_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)

    "Oracle+Concepts中英文对照版(10g+R2).chm"文件很可能包含了所有这些概念的详细解释,包括但不限于数据库设计、备份与恢复、网络配置、性能监控等,是学习Oracle数据库的宝贵资源。无论是初学者还是经验丰富的DBA,...

    oracle 锁的概念

    - **行级锁**:当某个事务正在对某一行数据进行操作时,其他事务不能对该行进行任何修改操作。行级锁是最细粒度的锁,可以最大限度地减少锁的竞争,提高并发性能。 - **表级锁**:表级锁会锁定整个表,阻止其他事务...

    oracle从人门到精通

    数据定义语言(DDL)在Oracle中用于创建和修改数据库对象,如表、视图、索引等。学习DDL,你需要掌握CREATE TABLE语句来创建新表,ALTER TABLE用于修改已有表结构,DROP TABLE删除表,以及CREATE INDEX建立索引等。 ...

    oracle 数据库常用的方法和错误总结

    **一、Oracle 数据库中的常用数据类型** 1. `VARCHAR2(长度)`:可变长度字符串,其中长度参数指定最大字符数。 2. `CHAR(长度)`:固定长度字符串,无论实际存储的数据是否达到指定长度,剩余位置都会用空格填充。 3...

Global site tag (gtag.js) - Google Analytics