博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle undo 复杂度--oracle核心技术读书笔记四
阅读量:4948 次
发布时间:2019-06-11

本文共 1441 字,大约阅读时间需要 4 分钟。

        一. 概述

        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数据,还有可能须要从磁盘读取改动的数据。由于改动的数据假设已经被刷新输出到磁盘,还须要又一次从磁盘调出来,然后将其值回退到旧值。假设事务比較长,到最后事务失败。那代价是很大的。回退须要消耗的时间,跟正常事务的时候差点儿相同,甚至很多其它。

转载于:https://www.cnblogs.com/claireyuancy/p/7071447.html

你可能感兴趣的文章
电脑插上耳机没声音
查看>>
pyqt5的使用目录
查看>>
UVA 1395 Slim Span 最小生成树
查看>>
Bug管理工具(TCE)之缺陷流程定制
查看>>
srv.exe蠕虫病毒~
查看>>
hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系...
查看>>
2.Flask jinjia2模板
查看>>
subprocess.Popen命令如何隐藏弹框
查看>>
java基础英语---第二十八天
查看>>
C语言 · 高精度加法
查看>>
前后端的关系
查看>>
flask登录功能实现的思路
查看>>
命令行创建Android应用,命令行生成签名文件,命令行查看签名信息,对APK包签名并编译运行...
查看>>
【SQLite】可视化工具SQLite studio
查看>>
python的嵌套列表推导
查看>>
C# Array
查看>>
mybatis与Spring的整合
查看>>
让人生厌的社交分享让人疲于分享
查看>>
Quartz学习总结
查看>>
Using User Defined Types in COM & ATL
查看>>