目录
- MySQL 事务的实现原理 之 MySQL 事务流程(MySQL 事务执行流程 和 恢复流程)详解
- MySQL 事务流程
- 1、MySQL 事务执行流程
- 1-1:MySQL 事务执行流程如图:
- 2、MySQL 事务恢复流程
- 2-1:事务恢复流程如下图:
MySQL 事务的实现原理 之 MySQL 事务流程(MySQL 事务执行流程 和 恢复流程)详解
MySQL 作为互联网行业使用最多的关系型数据库之一,其 InnoDB 存储引擎本身就支持事务。
MySQL 的事务实现离不开 Redo Log(重做日志) 和 Undo Log (回滚日志)。
从某种程度上说,事务的隔离性是由 锁 和 MVCC 机制实现的,原子性 和 持久性 是有 Redo Log 实现的,一致性是由 Undo Log 实现的。
Redo:重做、重复、恢复
Undo:撤销、取消
MySQL 事务的实现原理,涉及的内容大概有:
Redo Log :重做日志
Undo Log :回滚日志
BinLog:二进制日志文件
MySQL 事务的流程;
MySQL 中的 XA 事务。
MySQL 事务流程
MySQL 的事务流程分为 MySQL 事务执行流程 和 MySQL 事务恢复流程。
1、MySQL 事务执行流程
前面的文章介绍了 Redo Log (事务日志、重做日志)、Undo Log(回滚日志)和 BInLog(二进制日志),MySQL 事务执行的过程中,主要是通过 Redo Log 和 Undo Log 实现的。
1-1:MySQL 事务执行流程如图:
如图,可以看出,MySQL 在事务执行的过程中,会记录相应的 SQL 语句到 Undo Log 和 Redo Log,然后在内存中更新数据并形成脏页。
接下来 Redo Log 会根据一定的规则触发刷盘操作,Undo Log 和 数据脏页则通过 检查点机制 刷盘。
事务提交时,会将当前事务相关的的所有 Redo Log 刷盘,只有当前事务相关的所有 Redo Log 刷盘成功,事务才算提交成功。
脏页(内存页):
干净页:内存和磁盘中的数据一致
脏页:内存和磁盘中的数据不一致
为什么会出现 脏页?
平时很快的更新操作,都是在写内存和日志。 他并不会马上同步到磁盘数据页,这时内存数据页跟磁盘数据页内容不一致,我们称之为脏页。
2、MySQL 事务恢复流程
如果事务执行一切正常,则 MySQL 事务会按照上面的【MySQL事务执行流程图】的顺序执行。
实际上,MySQL 事务的执行不会总是那么顺利。如果 MySQL 由于某种原因崩溃或者宕机,则需要进行数据的恢复或者回滚操作。
按照【MySQL事务执行流程图】所示,如果事务在执行第 8 步,即事务提交之前,MySQL 崩溃或者宕机,此时会先使用 Redo Log 恢复数据,然后再使用 Undo Log 回滚数据。
如果在执行第 8 步之后 MySQL 崩溃或者宕机,此时会使用 Redo Log 恢复数据。
2-1:事务恢复流程如下图:
大致的事务恢复流程如下图所示:
如图可以看出,MySQL 发生崩溃或者宕机时,需要重启 MySQL 服务器。
MySQL 重启之后,会获取日志检查点信息,随后根据日志检查点信息使用 Redo Log 恢复数据。
如果在 MySQL 崩溃或者宕机时,事务还没有提交,则接下来使用 Undo Log 回滚数据。
如果在 MySQL 崩溃或者宕机时,事务已经提交,则用 Redo Log 恢复数据即可。