InnoDB 的一次更新事务是怎么实现的?

本文详细描述了InnoDB存储引擎的事务更新流程,涉及数据从磁盘加载到BufferPool,通过UndoLog保证原子性,更新内存并写入RedoLog,提交事务后记录BinLog,最后刷新脏页到磁盘以实现持久化。
摘要由CSDN通过智能技术生成

大体流程:

在这里插入图片描述


步骤:

1.加载数据到缓存中(Buffer Pool):

在进行数据更新时,InnoDB首先会在缓冲池(Buffer Pool)中查找该记录是否已经在内存中。如果记录不在内存中,会将需要更新的数据从磁盘文件加载到内存的缓冲池(Buffer Pool)中。
缓冲池是InnoDB存储引擎提供的缓存,用于加速数据的读取和修改操作。数据加载到缓冲池后,后续的操作都在缓冲池中进行。

2.写入Undo Log:

在更新数据之前,InnoDB会将原始数据的副本写入Undo Log(回滚日志)。
Undo Log是用于事务回滚和并发控制的重要组件,是用来保证事务原子性和一致性的一种机制。它记录了事务开始前的数据状态,以便在需要回滚时进行恢复。

3.更新内存数据:

接下来,InnoDB会在缓冲池中更新数据。
这意味着,当执行update语句时,InnoDB会先更新已经读取到Buffer Pool中的数据,修改操作会直接在内存中进行,而不是立即写入磁盘。
此时,缓冲池中的数据被标记为"脏页",表示与磁盘上的数据不一致。

4.写入Redo Log:

为了保证事务的持久性,InnoDB在Buffer Pool中记录修改操作的同时,InnoDB会先将更新操作写入Redo Log(重做日志)。
Redo Log是一种物理日志,记录了事务对数据库的修改操作。通过Redo Log,即使系统发生故障,也可以通过重做日志来恢复事务修改后的状态。

5.提交事务:

当事务完成所有的更新操作后,事务被提交。在提交事务时,InnoDB会将事务标记为"准备提交"状态。
此时,事务的修改操作仍然在缓冲池中,尚未写入磁盘。

6.写入BinLog:

在事务提交之后,InnoDB会将事务的修改操作写入BinLog(归档日志)。
BinLog是MySQL的二进制日志,用于记录数据库的所有修改操作。在Binlog中记录的信息包括:事务开始的时间、数据库名、表名、事务ID、SQL语句等。它可以用于数据恢复、主从复制、数据分析和同步等场景。

7.刷新脏页到磁盘:

最后,在提交过程完成后,InnoDB会将缓冲池(Buffer Pool)中的脏页刷新到物理磁盘上的数据文件中。
这个过程称为"刷脏"。通过刷脏操作,将缓冲池中的修改操作同步到磁盘,确保数据的持久性。
然而,这个写入过程并非立即执行,而是由后台线程异步执行的,因此可能会有一定的延迟。总而言之,MySQL会在适当的时机选择将数据写入磁盘以进行持久化。

总结:

先从磁盘中加载数据到Buffer Pool(缓存冲) -> 写入Undo log(重做日志)->更新缓存中的数据(对应的数据页被成为脏页)->写Redo log(重做日志)->提交事务->刷脏(将缓存中的数据刷新到磁盘文件中)
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值