Redo与Undo的理解
本文概要 本文分两部分, 第一部分概念介绍,重在理解。 第二部分通过MySQL Innodb中的具体实现,加深相关知识的印象。 本文的原意是一篇个人学习笔记,为了避免成为草草记录一下的流水账,尝试从给人介绍的角度开写。但在整理的过程中,越来越感觉力不从心,一是细节太多了,原以为足够了解的一个小知识点下可能隐藏了很多细节;二是内容与范围的取舍,既想有点技术性避免空谈,又不想陷入枯燥冗长的小细节描述。几番折腾,目前的想法把坑填上,能写完就不错了,你读起来有不顺或错误的地方请见谅,欢迎反馈。 1. 概念与理解 Redo与undo并非是相互的逆操作,而是能配合起来使用的两种机制。 说是两种机制,其实都是日志记录,不同的是redo记录以顺序附加的形式记录新值,如某条记录<T,X,V>,表示事物T将新值V存储到 数据库 元素X,新值可以保证重做; 而Undo记录通常以随机操作的形式记录旧值,如某条记录<T1,Y,9>,表示事物T1对Y进行了修改,修改前Y的值是9,旧值能用于撤销,也能供其他事务读取。 Redo用来保证事务的原子性和持久性,Undo能保证事务的一致性,两者也是系统恢复的基础前提。 1.1 Redo 一个事务从开始到结束,要么提交完成,要么中止,具有原子性。而反映在redo日志中可能需要若干条记录来保证,如: <T0 start> <T0,A,500> <T0,B,500> <T0