一. 概述

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数据,还有可能须要从磁盘读取改动的数据,由于改动的数据假设已经被刷新输出到磁盘,还须要又一次从磁盘调出来。然后将其值回退到旧值。

假设事务比較长。到最后事务失败,那代价是很大的,回退须要消耗的时间,跟正常事务的时候差点儿相同,甚至很多其它。

oracle undo 复杂度--oracle核心技术读书笔记四的更多相关文章

  1. 【转载】MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)

    1. Set  - 元组的集合,在 Set 中的元组用逗号分开,Set 以花括号括起来,例如: { ([Product].[Category].[Accessories]), ([Product].[ ...

  2. 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)

    Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...

  3. how tomcat works 读书笔记四 tomcat的默认连接器

    事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...

  4. 阅读《Oracle内核技术揭秘》的读书笔记

    阅读<Oracle内核技术揭秘>,对oracle的内存结构.锁.共享池.undo.redo等整理成了如下的思维导图:

  5. 《SDN核心技术剖析和实战指南》3.1控制器核心技术读书笔记

    在SDN的架构中,控制器可以说是SDN的核心,它负责对底层转发设备的控制以及向上层应用提供可编程性的北向接口.从实现上看,主要分三个层面来考虑,南向接口技术,北向接口技术以及东西向的可扩展性能力.下面 ...

  6. Java核心技术读书笔记02

    第四章 对象和类 类之间的关系 最常见的三种关系 依赖("uses-a") Order依赖Account类看信息 聚合("has-a") Order包含多个It ...

  7. Java核心技术读书笔记01

    Volume I Chapter 1  An Introduction to Java  • 1.1 Java as a Programming Platform• 1.2 The Java ‘Whi ...

  8. Java核心技术-读书笔记

    基本语法 Java中的所有函数都属于某个类的方法 Java没有任何无符号的int.long.short 或 byte 类型 浮点数值不适用于无法接受舍入误差的金融计算中,比如2.0-1.1不会输出想要 ...

  9. TCP/IP知识总结(TCP/IP协议族读书笔记四)

    参考:http://blog.chinaunix.net/uid-26275986-id-4109679.html 继续!TCP的流量控制和拥塞控制. TCP相对UDP可靠的地方在于它的拥塞控制.流量 ...

随机推荐

  1. Qt之多线程

    源地址:http://blog.csdn.net/liuhongwei123888/article/details/6072320 Qt 是一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造 ...

  2. Linux主机上发布java web应用

    1.链接远程主机命令 ssh user@hostname 如: shh root@192.168.1.1 2.查看主机操作系统版本 uname -a 3.linux系统安装mysql a)检查是否安装 ...

  3. java之redis篇(spring-data-redis整合) (转)

    redis的知识:官网 1,利用spring-data-redis整合 项目使用的pom.xml: <project xmlns="http://maven.apache.org/PO ...

  4. Python pip 安装包

    Python 第三方包可以使用pip 更容易地安装,和管理 pip 的下载地址 https://pypi.python.org/pypi/pip/ pip的使用以及相关文档参考 https://pip ...

  5. window2003远程桌面“已达最大连接数”

    使用命令行强制注销远程登录用户 Fri, 04/19/2013 - 09:29 - admin 来源地址: http://space.itpub.net/10067101/viewspace-6147 ...

  6. 事务代码SE16N查看数表时可以使用命令激活编辑功能

    &sap_edit命令可以激活SE16N编辑功能,维护数据表,但是是除了主键不能维护外都可以修改

  7. 内核空间和用户空间的分界 PAGE_OFFSET

      PAGE_OFFSET 首先看看PAGE_OFFSET的功能   内存映射 |            用户空间                  |   内核空间   | |——————+———— ...

  8. Linux中more命令的实现

    #include <stdio.h> #include <stdlib.h> #include <string.h> #define PAGELEN 24 #def ...

  9. eclipse不能进入debug

    首先说明一下.我肯定是以debug模式启动的.断点程序肯定能走到. 可是一点页面,程序就跳到class文件,而不是Java文件. 解决的方法是:window---preferences---tomca ...

  10. NET平台机器学习组件-Infer.NET

    NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化 阅读目录 关于本文档的说明 1.基本介绍 2.标准数据格式的映射 3.本地数据格式映射 4.评估数据格式映射 ...