`
liwenshui322
  • 浏览: 511309 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle undo 复杂度--oracle核心技术读书笔记四

阅读更多

一. 概述

        undo 保存的是旧数据。比如,你修改了一条记录将A列abc修改为def,那么undo里面保存的就是abc。目的有两个:1. 如果你的事务没有提交,但是已经将A列修改,那么别人读取这条数据的时候,不应该能够看到你修改后的内容def,应该还只能看到abc,这个时候就需要去读取undo,才能取到abc。 2. 如果你的事务后来失败,需要将A列由修改过的值def回退到之前的值abc,abc也要从undo里面去取。这篇文章,简要介绍一下读一致性(也就是别人无法读取到你修改的未提交的内容)与回滚(事务失败,回滚修改记录)是怎么实现的。

 

        二. 读一致性

        假如会话1 9:00开启事务,9:02分会话2修改了一条数据由A修改为了B,接着9:03分会话2又将同一条数据由B修改为C,会话2还没有提交。会话1   9:04分读取这条数据,应该读取到的是A,但是缓存中这条数据已经被修改成C了,那么怎么取到A呢。oracle是这样处理,在缓存中找到这条数据,发现这条数据被另外的会话修改了,而且另外一个会话还没有提交,查看修改时间发现是9:03分,比我会话开启时间9:00要晚,于是在数据块的事务槽中找到 另外一个会话这条修改对应的undo记录,这个时候会读取undo块,如果undo已经被刷新输出到磁盘,还需要从磁盘中重新读取出来。这个时候找到的是9:03修改对应的undo块,找到的旧数据是B,如果这条undo记录是9:00之前,我们就不需要往前找了,但是我们发现是9:03,我们还需要找找这条undo前面是否还有undo(本身undo记录会记录上一个undo记录的地址),我们能找到9:02分那条undo记录。接着再往前找发现没有了,那么9:02分那条undo记录里面的旧数据A就是我们要找的数据了。听起来好绕,给个图:

       

       三.  回滚

        回滚就是,事务失败了,我们需要将这个事务所做的修改全部回退。 说读一致性的时候,我们主要关注的是找数据所在的单个块,然后找这个块所有的undo记录的一个指针链表。从块开始,一直往后找,直到定位到一个足够老的undo数据。那么回滚其实也类似,回滚说的就是事务的历史,我们需要事务中所有的undo记录反向排序的指针链表,从最后做的修改开始回退,一直回退到事务做的第一个修改。

        回滚和读一致性看起来差不多,其实有一个重要的不同之处,读一致性,我们是在内存中生成一个数据块的拷贝,应用undo记录到该拷贝块上,一旦完成相关操作,拿到了旧数据,就会迅速舍弃这个块拷贝,因为我们的目的是拿到旧数据,并不是真的要改变数据。回滚就不同,回滚是要拿到当前真正的数据块,并应用undo记录来还原。

        1. 回滚操作的是当前数据块,undo应用于当前数据块,最终所做的修改是要持久化到磁盘的。而读一致性是不需要的。

         2. 回滚操作的是当前数据块,所以当我们改变它的时候(回滚就是改变),会生成重做(redo),至于会不会生成undo这个没有验证。

         3. 回滚操作不仅跟读一致性一样可能需要从磁盘读取undo数据,还有可能需要从磁盘读取修改的数据,因为修改的数据如果已经被刷新输出到磁盘,还需要重新从磁盘调出来,然后将其值回退到旧值。如果事务比较长,到最后事务失败,那代价是非常大的,回退需要消耗的时间,跟正常事务的时候差不多,甚至更多。

0
0
分享到:
评论

相关推荐

    undo-----router os 小秘技.doc

    undo-----router os 小秘技

    Oracle 面试宝典-undo.docx

    Oracle 面试宝典-undo.docx

    seata-oracle版undolog.sql

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

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

    里面也有段区块,ORACLE自动建立生成、自动使用UNDO段。 作为高级别的DBA是需要知道ORACLE如何使用UNDO段的。 1 Undo表空间及管理方式 ORACLE开始一个事务的时候,会用到表空间。将修改前的数据保存在UNDO段里。 ...

    oracle Undo表空间管理

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

    Oracle 10g 学习笔记

    │ -ORACLE公司传奇.doc │ 1作业.txt │ Oracle控制台使用.doc │ TP1V1.0.ppt │ 其它补充.txt │ 登录SQLPLUS.txt │ ├─2 │ 2上机.doc │ TP1V2.0.ppt │ ├─3 │ TP1V3.0.ppt │ ├─4 ...

    oracle undo

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

    undo-redo-vuex:一个Vuex插件,用于模块命名空间的撤消和重做功能

    src =" node_modules/undo-redo-vuex/dist/undo-redo-vuex.min.js " > </ script > 模块 import undoRedo from "undo-redo-vuex" ; 用法 作为的标准, undo-redo-vuex可以用于以下设置: 如何在商店模块中...

    Oracle11gOCP--1Z0-052视频集锦

    教程名称:Oracle 11g OCP--1Z0-052 视频集锦课程目录:【】1-Course Introduction【】10-Managing Data and Concurrency【】11-Managing Undo Data【】12-Implementing Oracle Database Security【】13-Database M ...

    oracle undo详解

    oracle数据库 关键表空间undo 的详细讲解 功能 和一些优势

    oracle的undo与redo

    oracle日志,Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback;Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。

    Oracle 12c-备份恢复学习实践手册合集

    Oracle 12c 闪回技术 Flashback Database.pdf Oracle 12c 闪回技术 Oracle Flashback技术.pdf Oracle 12c 管理UNDO.pdf Oracle 12c 数据库备份和恢复概述.pdf Oracle 12c 用户管理的备份和恢复.pdf Oracle 12c SCN...

    Oracle_Undo与Redo的通俗

    Oracle_Undo与Redo的通俗

    Oracle11g Memory&Storage Overview

     --Oracle 11g参数设置建议  --Oracle Database Memory Advisors 2.Storage Structure --Contolfiles&Online Redo Log Files --LMT vs DMT --ASSM --SEGments,extents&Datablocks --SPECIAL TABLESpaces:...

    脚本-Oracle释放过度使用的Undo表空间

    Oracle释放过度使用的Undo表空间,脚本

    收缩Oracle数据库的undo表空间

    演示如何收缩Oracle数据库的undo表空间

    oracle 收缩undo表空间

    oracle 收缩undo表空间,需要收缩Undo表空间时特别有用。

    undo-manager

    撤消管理器 JavaScript 中的撤消管理器实现。 它遵循以及未记录和禁用的实现。... var UndoManager = require ( 'undo-manager' ) ; 用法 初始化 撤消管理器可以使用以下方法实例化: var undoManag

    Oracle Undo

    Oracle Undo学习资料,对Undo的介绍有利于对回滚和Undo表空间有一个比较清晰地认识

Global site tag (gtag.js) - Google Analytics