原文:https://segmentfault.com/a/1190000017888478
作者:pjmike
我们都知道事务有4种特性:原子性、一致性、隔离性和持久性,在事务中的操作,要么全部执行,要么全部不做,这就是事务的目的。事务的隔离性由锁机制实现,原子性、一致性和持久性由事务的redo 日志和undo 日志来保证。所以本篇文章将讨论关于事务中的redo和undo的几个问题:
- redo 日志与undo日志分别是什么?
- redo 如何保证事务的持久性?
- undo log 是否是redo log的逆过程?
redo log
Redo 的类型
重做日志(redo log)用来保证事务的持久性,即事务ACID中的D。实际上它可以分为以下两种类型:
- 物理Redo日志
- 逻辑Redo日志
在InnoDB存储引擎中,大部分情况下 Redo是物理日志,记录的是数据页的物理变化。而逻辑Redo日志,不是记录页面的实际修改,而是记录修改页面的一类操作,比如新建数据页时,需要记录逻辑日志。关于逻辑Redo日志涉及更加底层的内容,这里我们只需要记住绝大数情况下,Redo是物理日志即可,DML对页的修改操作,均需要记录Redo.
Redo 的作用
Redo log的主要作用是用于数据库的崩溃恢复
Redo 的组成
Redo log可以简单分为以下两个部分:
- 一是内存中重做日志缓冲 (redo log buffer),是易失的,在内存中
- 二是重做日志文件 (redo log file),是持久的,保存在磁盘中
什么时候写Redo?
上面那张图简单地体现了Redo的写入流程,这里再细说下写入Redo的时机:
- 在数据页修改完成之后,在脏页刷出磁盘之前,写入redo日志。注意的是先修改数据,后写日志
- redo日志比数据页先写回磁盘
- 聚集索引、二级索引、undo页面的修改,均需要记录Redo日志。
Redo的整体流程
下面以一个更新事务为例,宏观上把握