`
baobaojinjin
  • 浏览: 142904 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

DDL语句为什么不能回滚

 
阅读更多

Sqlserver或一些其他的数据库中,DDL语句也是可以回滚的,那么Oracle为什么不能回滚DDL语句呢。 

 

要说明这个问题,首先需要说明什么是DDL语句。DDL语句是数据定义语句,包括各种数据对象的创建、修改和删除,以及授权等操作。

OracleDDL语句将转化为修改数据字典表的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已经设置TCREATED列非空,且包含默认值,因此B的插入必须被锁定,否则如果AB全部提交,A会话会发现即使执行了DDL语句,T表中仍然存在CREATED为空的记录。Oracle为了实现DDL可以回滚的功能,且实现多版本读一致性,那么就必须在DDL发生后,将修改的表锁定,避免其他会话的访问造成不一致。这会导致Oracle中出现锁升级的情况,并且严重的影响Oracle的并发性,而且会大大增加死锁产生的几率。

也许有人奇怪SQLSERVER或一些其他的数据库为什么可以实现DDL语句的回滚。事实上,前面提到了Oracle也是有能力实现DDL回滚的,只是这会极大的影响Oracle的并发性。要知道,Oracle的锁机制和多版本读一致性使得Oracle的并发性在所有数据库产品中首屈一指。显然为了实现DDL的回滚而损失最值得称道的并发性,Oracle认为得不偿失。其他数据库之所以可以实现,是因为这些数据库的锁机制本身就存在一定缺陷,比如大量的锁会占用系统的资源、读写操作互相阻塞、行级锁可能自动升级为表级锁。由于已经存在这些问题,所以实现DDL的回滚并不会在很大程度上使得并发性恶化,因为即使DDL不将行锁升级为表锁,可能其他的因素也会导致这种情况的发生。

分享到:
评论

相关推荐

    MySQL8.0新特性之支持原子DDL语句

    MySQL 8.0开始支持原子数据定义语言(DDL)语句。此功能称为原子DDL。原子DDL语句将与DDL操作...MySQL数据字典提供的集中式事务元数据存储消除了这一障碍,使得将DDL语句操作重组为原子事务成为可能。 官方文档: https

    Inception安装包

     还提供SQL语句的执行功能,可执行的语句类型包括常用的DML及DDL语句及truncate table等操作。 Inception在执行 DML时还提供生成回滚语句的功能,对应的操作记录及回滚语句会被存储在备份机器上面,备份机器通过...

    Oracle数据库语句大全.doc

    事务控制语言(TCL)用于控制数据库的事务,包括提交事务、回滚事务和保存点的语句。Oracle 数据库支持多种事务控制语句,例如 COMMIT、ROLLBACK 和 SAVEPOINT。 Oracle 数据库语句大全是 Oracle 数据库管理系统中...

    Mysql误操作后利用binlog2sql快速回滚的方法详解

    在日常工作或者学习中,操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,下面这篇文章主要给大家介绍关于Mysql误操作后利用binlog2sql快速回滚的方法,话不多说,来一起看...

    oracel闪回机制

    在Oracle中,对于提交的变化,是没有...同时,和可能存在一种情况,错误的对表执行了drop操作,由于DDL语句在执行后隐含的含有提交操作,所以这种情况也没有办法把执行了的错误DROP操作回滚的DROP语句执行前的状态。

    经典全面的SQL语句大全

    下列语句部分是Mssql语句,不可以在access中使用。  SQL分类:  DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)  DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)  DCL—数据控制语言(GRANT,REVOKE,...

    Sql语句50条案例,从创建数据库入门到进阶

    数据定义语言(DDL)案例将展示如何创建和修改数据库结构,例如创建表、修改表结构和删除表等。数据操作语言(DML)案例将包括如何插入、更新、删除和查询数据记录,这些操作是日常数据库交互中最频繁使用的功能。...

    数据库失败类型之用户错误

    但是对于DDl语句来说,用户是无法回滚错误的语句。  因为,commit被内置到DDL语句中。  解决用户错误的理想方式是首先防止这些错误的出现。培训用户只是其中的一部分工作,不过重要的是设计软件。从而使任何...

    TDengine是一个高性能、分布式、支持SQL的时序数据库.zip

    3、事务控制语言(TCL):它的语句能确保被DML语句影响的表的所有行及时得以更新。包括COMMIT(提交)命令、SAVEPOINT(保存点)命令、ROLLBACK(回滚)命令。 4、数据控制语言(DCL):它的语句通过GRANT或REVOKE...

    SQL optimizer and rewriter. - SQL 优化、重写器(辅助 SQL 调优) .zip

    3、事务控制语言(TCL):它的语句能确保被DML语句影响的表的所有行及时得以更新。包括COMMIT(提交)命令、SAVEPOINT(保存点)命令、ROLLBACK(回滚)命令。 4、数据控制语言(DCL):它的语句通过GRANT或REVOKE...

    SQL有如下分类总结

    数据定义语句(DDL): 用于建立(create)、 修改(alter)和 删除数据库对象(drop)。《会自动提交事务》 数据控制语句(DCL):用于执行权限授予和收回操作。 使用grant命令可以将权限授予用户,使用...

    MySQL Binlog Digger 4.28 + Mysql Binlog分析 + 数据库

    当发生误删、误增、误改时,它可以帮助我们从binlog中快速定位到误操作的重做语句(redo sql),同时推理出回滚语句(undo sql)。此外,它还可以结合[mysqld]的init-connect参数做mysql 8.0的数据库审计。 ​一. 对dml...

    Oracle经典教程

    在Oracle开发中,客户端把SQL语句发送给服务器,服务器对SQL语句进行编译、执行,把执行的结果返回给客户端。Oracle SQL语句由如下命令组成: 数据定义语言(DDL),包括CREATE(创建)命令、ALTER(修改)命令、...

    一个oracle指令的好网站

    * CREATE ROLLBACK SEGMENT:用于创建回滚段的语句 * CREATE SCHEMA:用于创建模式的语句 * CREATE SEQUENCE:用于创建序列的语句 * CREATE SESSION:用于创建会话的语句 * CREATE SPFILE:用于创建服务器参数文件的...

    ORACLE数据库事务处理和故障恢复

    * DDL封锁(字典封锁):DDL封锁保护模式对象(如表)的定义,DDL操作将影响对象,一个DDL语句隐式地提交一个事务。 * 内部封锁:保护内部数据库和内存结构,这些结构对用户是不可见的。 五、手工的数据封锁 在...

    数据库.txt

    第一章数据库的简介 数据库 数据库(dataBase,DB)是指长期存储在计算机内的,有组织,可共享... GRANT语句用于给用户增加权限,REVOKE语句用于收回用户的权限,COMMIT语句用于提交事务,ROLLBACK语句用于回滚事务。

    第一章数据库的简介.docx

    第一章数据库的简介 数据库 数据库(dataBase,DB)是指长期存储在计算机内的,有组织,可共享... GRANT语句用于给用户增加权限,REVOKE语句用于收回用户的权限,COMMIT语句用于提交事务,ROLLBACK语句用于回滚事务。

    详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始

    不同点: 1. truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结构... truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发 trigger. 3.delete语句不

    SQL 优化原则

    在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。  1. IS NULL 与 IS NOT NULL  不能用null作...

    SQL 任务 - NineData.pdf

    SQL 任务是对数据库发起 SQL 操作的任务,主要包括 DDL(数据库定义语言)、DML(数据库操纵语言)等 SQL 语句。本文介绍如何使用 SQL 任务。为保障数据安全,对目标数据源没有写权限的用户无法对该数据源的内容发起...

Global site tag (gtag.js) - Google Analytics