第二章 MySQL 事务的实现原理
一、Redo Log
MySQL 中事务的原子性和持久性是由 Redo Log 实现的,它确保 MySQL 事务提交后,事务所涉及的所有操作要么全部执行成功,要么全部执行失败
1.Redo Log 基本概念
Redo Log 也被称作重做日志,它是在 InnoDB 存储引擎中产生的,用来保证事务的原子性和持久性。Redo Log 主要记录的是物理日志,也就是对磁盘上的数据进行的修改操作。Redo Log 往往用来恢复提交后的物理数据页,不过只能恢复到最后一次提交的位置
Redo Log 通常包含两部分:一部分是内存中的日志缓冲,称作 Redo Log Buffer,这部分日志比较容易丢失,另一部分是存放在磁盘上的重做日志文件,称作 Redo Log File,这部分日志是持久化到磁盘上的,不容易丢失
2.Redo Log 基本原理
Redo Log 能够保证事务的原子性和持久性, 在 MySQL 发生故障时,尽力避免内存中的脏页数据写入数据表的 IBD 文件。在重启 MySQL 服务时,可以根据 Redo Log 恢复事务已经提交但是还未写入 IBD 文件中的数据,从而对事务提交的数据进行持久化操作
例如,在商城系统的下单业务中,用户提交订单时,系统会创建一条新的订单记录并保存到订单数据表中。在 MySQL 内部,Redo Log 的基本原理可以用下图表示:

从上图可以看出,用户下单后系统创建订单记录,MySQL 在提交事务时,会将数据写入 Redo Log Buffer,而 Redo Log Buffer 中的数据会根据一定的规则写入 Redo Log 文件
当MySQL 发生故障重启时,会通过 Redo Log 中的数据对订单表中的数据进行恢复,也就是 Redo Log 文件中的数据恢复到 order.ibd 文件中
系统可以根据需要,查询并加载订单表中的数据(也就是加载 order.ibd 文件中的数据),也可以向订单表写入数据(也就是持久化数据到 order.ibd 文件中)