Undo和Redo以及牛逼的MVCC

前段时间看了下数据库的基础知识,稍微整理一下。

什么是Redo

Redo,顾名思义就,重做。以恢复操作为目的,重现操作。

Redo记录transaction logs,分为online和archived。

比如,机器停电,那么在重起之后需要online redo logs去恢复系统到失败点。

比如,磁盘坏了,需要用archived redo logs和online redo logs区恢复数据。

什么是Undo

Undo,意为取消,以撤销操作为目的,返回上一个状态,类似备份。

注意:Redo也会记录Undo操作。

举个例子

比如我们往一个表中插入一条数据。

  • redo记录这个操作。
  • undo记录这个操作。
  • redo记录上一步undo操作。

如果这张表有索引,那么表中索引的改变也会作redo和undo。

日志先行

redo和undo都是写在内存中的,所以一旦系统奔溃,这些文件将不复存在。所以数据库中很重要的一个东西就是日志。redo log 的信息就需要先写到磁盘上,因为它是最原始的操作,能用于场景重现。

牛逼的MVCC

曾在讲座中听到,当年oracle独霸全球时,很大程度上就是得益于MVCC。

mvcc(多版本控制),如果把基于锁的并发控制机制称成为悲观机制,那么MVCC就算是乐观机制。

乐观和悲观的区别在于,悲观机制是必须等所有条件完备之后再开始执行。乐观机制则是先碰运气往下做,如果不行就回滚。

mvcc的实现:

 

oracle允许可以由多个用户对数据库进行操作,当你执行一个查询几百万条记录的操作时,这个过程可能需要几分钟。在这个过程中其它用户对你查询的数据时行了修改。这里就要保证你查询的结果是被修改之前的。

刚才说了,乐观机制是需要回滚的,所以undo就派上用场了。

当我们执行一个事务的时候,oracle会分配一个SCN编号,这个编号是递增的。下一个事务的编号一定比当前事务的编号大。上图中执行第一个事务分配的编号为10023,在这个事务执行的过程中,另一事务对SCN 编号为10008和10021的数据块进行了修改。用来替换的数据块SCN编号为10024 ,而被替换掉的数据块会被保存到undo 上面。当第一个事务执行到被修改过的数据块时,发现10024比10023大,这个时候就会到undo segment上找比自己SCN号小的数据块进行读,于是发找到了SCN号为10008和10021两个块。这样就有效的保证读一致性。

执行看上去总是这么顺利,得益于无锁机制。但是提交时就可能悲剧。因为提交时需要检查版本冲突,如果失败则需要重做一次。

mvcc的适用场景:

mvcc费时的地方在于版本冲突时。所以mvcc适用于读多于写的场景。因为冲突只出现于写的时候。

如果写操作很多,则会引起频繁的冲突,使得mvcc花费很多时间在retry。这种情况还不如直接使用锁。

说到底还是在于retry的代价是否大,如果retry代价小,就适合mvcc这种尝试性的操作,否则就是用锁。

 

转载请注明:旅途@KryptosX » Undo和Redo以及牛逼的MVCC

时间: 2024-08-04 00:15:50

Undo和Redo以及牛逼的MVCC的相关文章

如何成为一名牛逼的产品经理

摘要: 前言: 师兄,我们这款产品的核心功能是要达到XXX,可以采用XX技术来实现,这样可能会比较好,且,你管我用什么技术,我能给你实现就好了,你又不懂技术,瞎扯什么蛋呢?瓜兮兮嘞 前言: "师兄,我们这款产品的核心功能是要达到XXX,可以采用XX技术来实现,这样可能会比较好","且,你管我用什么技术,我能给你实现就好了,你又不懂技术,瞎扯什么蛋呢?瓜兮兮嘞--" "美女,这个UI可以加宽Xpx.加高Xpx会更好看,用XX修图软件可以处理得更棒"

WF4工作流设计器模型对Undo和Redo的支持

WF4的设计器模型中提供了UndoEngine类,提供设计时的Undo(撤销)和Redo(重做)功能.我们可以调用工作设计器的服务来启用Undo和Redo功能.主要涉及到下面几个类: 下面一个简单例子说明 1.WPF的Xaml部分如下: <Window x:Class="CaryUndo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x=&

PHP超牛逼无限极分类生成树方法

  这篇文章主要介绍了PHP超牛逼无限极分类生成树方法,本文巧用PHP中的引用实现树的生成方法,比递归方法高端多了,需要的朋友可以参考下 你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了. 这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,巧在引用,整理分享了. 代码如下: function generateTree($items){ $tree = array(); foreach($items as $item){ if(isset($

想成为牛逼程序员? 先数数编程语言之父们的头发

有一种生物,人称"程序猿" or "攻城狮" 工作是高端大气上档次,工资是低调奢华接地气! 往往城还没攻下来,头发就先掉下来! 世人眼中的当程序员的必经之路是这样的 找不到女朋友的原因是这样的 事实是否如上所说的那样呢?那就不得而知了,不过深入了解了解那些编程语言之父们头顶的雨林是否茂盛,以及他们的丰功伟绩,没准能得出什么参考标准呢. 01.Java 之父 James Gosling 头顶茂密指数: 第一位出场的就是我们大名鼎鼎的 Java 之父,James Gos

又一款牛逼哄哄的日历插件jeDate横空出世

原文:http://www.jayui.com/jedate/index.html 下载:http://download.csdn.net/detail/cometwo/9393326 选择理由 jeDate除了包含日期范围限制.开始日期设定.自定义日期格式.时间戳转换.当天的前后若干天返回.时分秒选择.智能响应.自动纠错.节日识别,操作等常规功能外,还拥有更多趋近完美的解决方案. QQ群:516754269 github下载:github.com/singod/jeDate 注意事项 1.解压

老鱼看会:低调才是最牛逼的炫耀!

文章讲的是老鱼看会:低调才是最牛逼的炫耀!一群平均年龄只有27岁的年轻人,创造了一款每天有200万人使用的产品,并创造了年近2亿元的销售额,却低调的鲜为人知! ▲题图来自帆软吉祥物:悟帆 "低调"笔者认为最好的诠释是"能高调但不高调".虽然不是很显眼甚至不被人所熟知,可实质上它是在观察.积累.沉淀,在最适当的时候释放!告诉身边的每一个人什么是真正的光彩夺目! 近日,笔者就参加了这样一场低调的活动.一个厂商(非第三方)举办的大会,没有红头文件,到场117家银行,而且参

Docker获9500万美元D轮融资,并牛逼地说B轮的钱还没花完

本文讲的是Docker获9500万美元D轮融资,并牛逼地说B轮的钱还没花完,[编者的话]2015年4月14日,Docker完成9500万美元的 D 轮融资.此前,该公司已完成三轮融资,包括1500万美元的B轮融资及4000万美元的C轮融资.同时Docker还表示,他们B轮的钱还没花完.好吧,受不了了.... 在过去的两年内掀起了容器热潮的创业公司--Docker,今天宣布,它完成了一笔由Insight Venture Partners领投的9500万美元的 D 轮融资.在这一轮新的投资者包括Co

假事务之名,深入研究UNDO与REDO

 "有道无术,术尚可求:有术无道,止于术".今天让我们一起来看看DBA+社群联合发起人郭耀龙大师如何布道.     专家简介   郭耀龙 DBA+社群联合发起人   超过5年Oracle数据库经验,服务于大型制造业.银行.政府.电信.电力等行业,曾主导某大型制造业的16核心系统从10g向11g平稳演进,擅长Oracle数据库架构规划.性能调整.故障诊断.SQL优化,熟悉Oracle RAC及MAA架构,对大型IT系统的Oracle数据库运维有较丰富的经验.      本文主要讲述关于u

BAT解密:互联网技术发展之路(3)- 牛逼公司的技术架构都是这个范

大部分人对于BAT的技术有一种莫名的崇拜感,觉得只有非常牛逼和天才才能做出现在的这些系统,但经过前面两篇博文的分析,我们可以看到其实并没有什么神秘的力量和魔力融合在技术里面,而是业务的不断发展推动技术的不断发展,一步一个脚印,持续几年甚至10几年的发展,才能达到当前技术复杂度.先进性.牛逼度. 抛开BAT各自差异很大的业务,站在技术的角度来看,其实BAT的技术架构基本是一样的,再将视角放大,你会发现整个互联网行业的技术发展,最后都是殊途同归. 如果你正处于一个创业公司,或者正在成为另一个BAT的