InnoDB实现事务的简单过程

728 阅读3分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

先导知识

Buffer Pool 缓冲池

MySQL作为一个存储系统,跟操作系统一样都是具有缓冲池(Buffer Pool),可以避免每次查询数据都进行磁盘IO。Buffer Pool缓冲池就是用来缓存表数据与索引数据,把磁盘上的数据加载到缓冲池中,避免每次访问都进行磁盘IO,起到加速访问的作用。

Log Buffer 日志缓冲区

Log Buffer为日志缓冲区,是一块内存存储区域,用于保存要写入磁盘上的日志文件的数据,且日志缓冲区的内容会定期刷新到磁盘上。日志缓冲区大小由innodb_log_buffer_size变量定义,默认大小为16MB。

redo log 重做日志

redolog是InnoDB存储引擎所特有的一种日志,主要是用来恢复数据的,用于保证已提交事务的持久性。redo log会记录已成功提交事务的修改信息,并且会把redo log持久化到磁盘,即使遇到了MySQL宕机或者其他问题,MySQL重启之后再读取redo log恢复最新数据,保证数据不丢失。

undo log 回滚日志

undo log 回滚日志是用来保存事务开始前数据的一个版本(可以看做是存储备份数据的地方),当事务出现异常时,通过undo log可以将数恢复到事务开始前的状态。因此,undo log实现了事务的原子性。在执行回滚的过程中,仅是将数据从逻辑上恢复到事务开始之前的状态,而不是物理上操作实现的,这一点是不同于redo log的。

Innodb实现事务的过程

InnoDB正是通过Buffer pool、redo log、undo log、Log Buffer来实现事务的,通过以上一些关键问题的了解,接下来就可以来简单描述一下InnoDB实现事务的简单过程(以一个update更新语句为例):

  1. InnoDB在接收到update语句后,会先根据条件查找出数据所在的页,然后将这一页的数据缓存到Buffer Pool缓冲池中。

  2. 执行update语句,修改缓存到Buffer Pool中的数据。

  3. 针对update语句生成一个redo log重做日志,并将redo log保存到 Log Buffer日志缓冲区。

  4. 针对update语句生成undo log回滚日志,用于事务回滚,保证原子性。

  5. 如果要提交事务,则将redo log持久化,将其持久化到磁盘上,保证事务的持久性。持久化redo log后,MySQl会使用其他机制,将Buffer Pool缓冲池中修改的数据页持久化到磁盘中。

  6. 如果事务回滚,则利用undo log回滚日志进行事务回滚。

以上就是关于InnoDB实现事务的简单过程的介绍,如果有错误的地方,还请留言指正,如果觉得本文对你有帮助那就点个赞吧😋😋

默认标题_动态分割线_2021-07-15-0.gif

往期推荐