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数据,还有可能须要从磁盘读取改动的数据,由于改动的数据假设已经被刷新输出到磁盘,还须要又一次从磁盘调出来。然后将其值回退到旧值。
假设事务比較长。到最后事务失败,那代价是很大的,回退须要消耗的时间,跟正常事务的时候差点儿相同,甚至很多其它。
oracle undo 复杂度--oracle核心技术读书笔记四的更多相关文章
- 【转载】MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)
1. Set - 元组的集合,在 Set 中的元组用逗号分开,Set 以花括号括起来,例如: { ([Product].[Category].[Accessories]), ([Product].[ ...
- 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)
Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...
- how tomcat works 读书笔记四 tomcat的默认连接器
事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...
- 阅读《Oracle内核技术揭秘》的读书笔记
阅读<Oracle内核技术揭秘>,对oracle的内存结构.锁.共享池.undo.redo等整理成了如下的思维导图:
- 《SDN核心技术剖析和实战指南》3.1控制器核心技术读书笔记
在SDN的架构中,控制器可以说是SDN的核心,它负责对底层转发设备的控制以及向上层应用提供可编程性的北向接口.从实现上看,主要分三个层面来考虑,南向接口技术,北向接口技术以及东西向的可扩展性能力.下面 ...
- Java核心技术读书笔记02
第四章 对象和类 类之间的关系 最常见的三种关系 依赖("uses-a") Order依赖Account类看信息 聚合("has-a") Order包含多个It ...
- Java核心技术读书笔记01
Volume I Chapter 1 An Introduction to Java • 1.1 Java as a Programming Platform• 1.2 The Java ‘Whi ...
- Java核心技术-读书笔记
基本语法 Java中的所有函数都属于某个类的方法 Java没有任何无符号的int.long.short 或 byte 类型 浮点数值不适用于无法接受舍入误差的金融计算中,比如2.0-1.1不会输出想要 ...
- TCP/IP知识总结(TCP/IP协议族读书笔记四)
参考:http://blog.chinaunix.net/uid-26275986-id-4109679.html 继续!TCP的流量控制和拥塞控制. TCP相对UDP可靠的地方在于它的拥塞控制.流量 ...
随机推荐
- KaOS 2016.04 发布,桌面 Linux 发行版
KaOS 2016.04 发布了,KaOS是一份桌面Linux发行,其特色在于最新版本的KDE桌面环境及其他流行的使用Qt工具包的软件程序.它最初基于Arch Linux,但从2013年四月起,开发者 ...
- 如何安装(装载)axure组件(部件)
我们在网络上经常可以下载到很多网友精心设计的axure组件,这些组件给我们节省了很多的时间,方便了我们进行原型设计,可是对于很多刚刚接触axure的朋友就遇到了2个问题: 第一:到哪里去下载这些组件 ...
- 杭电 1711 Number Sequence
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Android中View绘制优化二一---- 使用<include />标签复用布局文件
本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 译二: 使用<include />标签复用布局文件 翻译地址:http://de ...
- Android中View绘制优化之一---- 优化布局层次
本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 前言,竟然是翻译,当然得弄的有板有眼. 照着大作家格式来咯 , - - . 译序 最近一直在做锁屏界面,之前也 ...
- Direct UI 思想阐述(好多相关文章)
在界面开发中,目前DirectUI是个热门的技术名称,因为众多的知名公司都是用DirectUI方式作出了很炫丽的界面.而对于大多数熟悉Win32控件,熟悉MFC开发的开发人员来说,我们应该做何选择? ...
- Boost Thread学习笔记
thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 W ...
- 五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时
五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整 ...
- 积累的VC编程小技巧之工具提示
1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) { //一句话解决问题 ...
- J2EE开发框架搭建(2) - springmvc4 + spring4 + hibernate4 整合
1. 打开hqhop-framework-parent项目下的pom.xml文件.加入springmvc4 , spring4 , hibernate4 ,以及数据源druid的依赖包,插件,依赖包版 ...