`
sjk2013
  • 浏览: 2185092 次
文章分类
社区版块
存档分类
最新评论

undo学习系列之澄清一个被误解的概念

 
阅读更多

在oracle中有三种数据,data、redo和undo。undo是oracle在undo段中记录的信息,用于取消或回滚事务。学习上要把重点放在undo的作用以及基本概念。
你对数据执行修改时,oracle会生成undo信息,以便回到更改前的状态。我们可以通过闪回事务历史读取undo。
undo在数据库内部存储在一组特殊的段中,称之为undo段。
rollback segment和undo segment一般认为是同义词。前者使用手动undo管理,后者自动undo管理。他俩的意图和作用都一样。
通常对undo有一个误解,认为undo用于将数据物理地恢复到执行语句或事务之前的样子,但实际上并非如此。数据库只是逻辑地恢复到原来的样子,所有修改都被逻辑地取消,但是数据结构以及数据块本身在回滚后可能大相径庭。因为在多用户并发系统中,往往会有其他的事务在修改同一个块,如果简单地将一个块放回到我们事务开始前的样子,这样会撤销他者的工作。
通过如下实验可以阐述上面的观点:
1)创建一个空表
2)对它做一个全表扫描,观察读表所执行的I/O数量
3)在表中填入许多行(但没有提交)
4)回滚这个工作,并撤销
5)再次进行全表扫描,观察所执行的I/O数量
6)比较2)和5)的数量差

[注:本实验2),5)都要进行两次全表扫描,以减少优化器统计时所进行的I/O影响]

hr@ORCL> create table t as select * from all_objects where 1=0;

Table created.

hr@ORCL> select * from t;

no rows selected

hr@ORCL> set autotrace traceonly statistics
hr@ORCL> select * from t;

no rows selected


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
hr@ORCL> insert into t select * from all_objects;

49867 rows created.
hr@ORCL> set autotrace off 
hr@ORCL> rollback;

Rollback complete.

hr@ORCL> select * from t;

no rows selected

hr@ORCL> set autotrace traceonly statistics 
hr@ORCL> select * from t;

no rows selected


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        689  consistent gets


最初,这个查询需要3个I/O来完成这个表的全表扫描。前面的insert导致将一些块增加到表的高水位线之下,这些块并没有因为回滚而消失,它们还在那里,而且已经格式化,只不过现在为空。全表扫描必须读取这些块,看看其中是否包含行。
一方面,段确实由create创建(注:11gR2会有延迟段创建,即:由insert创建)但是未被rollback“撤销”;另一方面,由create新创建的格式化块被第二次扫描,这两方面结合在一起,说明回滚只是一种逻辑上“将数据库恢复原状态”的操作。数据库并不会完全恢复原状,只是逻辑上相同而已。

分享到:
评论

相关推荐

    Undo

    Undo

    实现Redo Undo的一个简单实例,包含源码

    Delphi 中实现Redo Undo的一个简单实例,包含源码

    专题之Undo工作原理剖析

    专题之Undo工作原理剖析 相当专业的深入剖析 关于oracle 10g中Undo表空间的原理解析 值得看下

    C#做的简单的Undo、Redo功能的实现

    这个是做实验时,简单基本的Undo、Redo的操作、在一个winForm中实现,并且可以设置Undo的最大次数。包中除了项目外,还附有报告.

    redo undo framework source code

    redo undo framework source code redo undo framework source code

    相克军 ORACLE 讲座 深度剖析UNDO段 笔记.doc

    UNDO表空间用来存放改变前的旧值。... ORACLE开始一个事务的时候,会用到表空间。将修改前的数据保存在UNDO段里。 Undo的三个作用 读的一致性,构造CR块 回滚 实例恢复(时的回滚) --查询UNDO表空间的名字 -----

    12c 新特性-Temporary Undo

    介绍12c新特性Temporary Undo

    mfc support redo/undo

    实现redo,undo操作,来源于网络分享下。

    c# undo/redo例子

    c# undo/redo例子 支持文字的样式,颜色修改 动态进度条

    Undo_Redo机制在CAD中的应用

    摘要:为了增强CAD系统的灵活性,提高设计的效率,本文引入设计模式概念,通过对数据对象的持久化.设计出一套支 持无限Undo/Redo和批量化操作的CAD图形绘制系统,文章介绍了各模块的实现原理及核心算法。 关键词:...

    C#实现的undo/redo的window窗体

    针对一个window窗体实现了undo/redo功能,包括textBox,checkBox, listBox, comboBox, radioButton以及按钮焦点变化的实现。可能有些小bug思路仅供参考。完整的工程文件,VS打开即可运行,欢迎评论~ 详细说明参见...

    undo redo 原型设计

    cpp文件 undo redo 原型设计 部分代码 class Command { public: virtual BOOL UnDo() = 0; virtual BOOL ReDo() = 0; };

    oracle Undo表空间管理

    oracle Undo表空间管理,oracle 学习人员必看的不可缺少的资料。

    seata-oracle版undolog.sql

    oracle版本的undolog建表语句。 2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地...

    C# undo\redo框架

    Undo/Redo framework for editing controls in a Windows application 在Windows应用程序中编辑控件的撤销/重做框架。

    oracle undo

    oracle undo的更深一层的东西,能解决一定的undo问题。

    UNDO表空间管理

    比较深入浅出的描述了基于oracle10g/11g的UNDO表空间的管理

    在qt下实现了undo的代码

    在qt下实现了undo的代码

Global site tag (gtag.js) - Google Analytics