在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是为了将用户的读写操作和数据字典的修改隔离开,用户数据的读写不应该和数据字典的操作放在同一个事务中。

为了说明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语句为什么不能回滚相关推荐

  1. 【Mysql面试高频】- drop、delete、truncate的区别,是否是DML或者DDL的,能否回滚

    [Mysql面试高频]- drop.delete.truncate的区别,是否是DML或者DDL的,能否回滚 DML(Data Manipulation)数据库操作语言,即实现了基本的"增删 ...

  2. mysql 事务回滚语句_数据库事务回滚语句-sql事务回滚语句是-用于事务回滚的sql语句...

    sql 回滚语句 这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份 或不能备份日志(truncate log on checkpoint选项为1),那幺就无法进 ...

  3. 记录一次生产事故MYSQL执行语句错误,回滚数据

    MYSQL执行语句错误,使用binlog回滚数据: 早上接到 leader 通知,说有个开发不小心将数据库的一张表数据全量使用update语句更新错误了,由于之前的备份数据是一周之前的,与用户使用存在 ...

  4. mysql自动生成回滚语句_如何根据sql语句逆向生成回滚语句?

    当启动Binlog后,事务会产生Binlog Event,这些Event被看做事务数据的一部分.因此要保证事务的Binlog Event和InnoDB引擎中的数据的一致性.所以带Binlog的Cras ...

  5. mysql8.0数据回滚_大企业数据库服务首选!AliSQL这几大企业级功能你不可不知

    MySQL代表了开源数据库的快速发展,从2004年前后的Wiki.WordPress等轻量级Web 2.0应用起步,到2010年阿里巴巴在电商及支付场景大规模使用MySQL数据库,再到2012年开始阿 ...

  6. 一款SQL自动检查神器,再也不用担心SQL出错了,自动补全、回滚等功能大全

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:最美分享Coder 来源:http://suo.im/6uI ...

  7. 查看回滚事物sql_卧槽:这款 SQL自动检查神器,吊炸天的功能,真TMD多!!

    介绍 Yearning MySQL 是一个SQL语句审核平台.提供查询审计,SQL审核等多种功能,支持MySQL ,可以在一定程度上解决运维与开发之间的那一环,功能丰富,代码开源,安装部署容易! 开源 ...

  8. SQL自动检查神器,再也不用担心SQL出错了,自动补全、回滚等功能大全

    点击关注公众号,实用技术文章及时了解 Yearning MYSQL 是一个SQL语句审核平台.提供查询审计,SQL审核等多种功能,支持Mysql,可以在一定程度上解决运维与开发之间的那一环,功能丰富, ...

  9. 事务、提交、回滚、脏读、幻读等名词解释以及事务隔离级别详解

    看视频的时候,听大佬说commit.事务.脏数据等等名词,听的弟弟是一脸懵呀,今天特地搜集.整理出来了这些名词的解释了,下面我们一起看一下. 文章目录 事务:transaction 概念 四个属性(A ...

最新文章

  1. cocos2d-x 关于tilemap滚动时黑线闪动的问题
  2. Apache 与 Nginx
  3. spark向量矩阵的使用(scala)
  4. PHP autoload实践
  5. Python模块——subprocess
  6. 数据结构与算法的联系
  7. 华为轮值董事长郭平:美国在5G方面已落后
  8. 黑莓手机安装linux,Ubuntu下善用黑莓(备份,同步,装卸备份应用程序)
  9. 达人管理系统(CRM)原型图
  10. 平面设计就业方向是什么?
  11. NTP授时服务器(网络校时服务器)对医院信息化建设的重要
  12. MyBatisplus字段名与表名的映射
  13. 图解 魔方快速还原 7步法
  14. Cent OS 7 的日常操作
  15. PHp猴子偷,这些猴子成精了!偷东西偷得很萌很认真……
  16. hbase排序 ASCII码对照表
  17. 【论文阅读】改进的基于均值滤波的单幅图像去雾算法研究
  18. mybatis在实际项目中常见的排坑配置
  19. 什么是ElasticSearch?babe
  20. e5408fc4a618ed2a663d0306def2cec3 (学生实验,谢谢)

热门文章

  1. 熵(Entropy),交叉熵(Cross-Entropy),KL-松散度(KL Divergence),似然(Likelihood)
  2. Sql 行转列 STUFF
  3. mysql 禁用密码规则校验
  4. CSS中的Position属性
  5. 使用AT指令发送PDU短信的全过程
  6. SQL Server 2008获取一个表的字段,类型,长度,是否主键,是否为空,注释等信息...
  7. 动态修改页面Meta 标签 keywords description
  8. s6-4 TCP 数据段
  9. w3m linux,Linux 终端浏览器 w3m
  10. auto.js停止所有线程_十年架构师带你快速上手多线程