MySQL事务的实现原理之Undo Log的分析

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

Undo Log日志是何许人也

MySQL事务中,主要的功能特性,依赖于 Undo log ,因为四个特性

  • 原子性, 持久性----> Redo log

  • 隔离性 ----->MVCC机制和锁

  • 一致性 ----->Undo log

因为 Undo log 在Mysql事务实现中,主要有两方面,

    1. 多版本的并发事务控制-MVCC版本
    1. 回滚事务

undo Log的产生过程

在MySQL事务开始之前,比如我有一个查询的数据的功能, 在识别到当前可能会查询到这个表的数据后, 然后快照其中的数据, 如果 数据库的事务 发生回滚操作, 或者是数据库发生异常导致宕机或者是故障,这时候Undo log,对数据库中未提交的事务进行回滚操作, 从而保证数据库中, 数据查询到的数据的一致性。

本质: undo log 是 为了回滚事务存在。

Undo log日志属于逻辑日志,相比于Redo log 的物理日志,(操作性的),这个日志记录的是数据快照和当前数据 反向事务, 举个例子,

如果我先需要insert 一条数据 ,到用户表中,场景是我注册了一个新的用户,但是在这个事务,也就是说Mysql接到这个添加的事务请求开始时候,先进行数据快照,然后在运行的过程中,会添加一个undo log 日志是删除这条产生的数据 delete语句, 也即是说会回滚 事务--。

同理可得, 如果说是delete事务, undo log 就会产生 一条 insert的数据, 因为这个日志就是为了回滚日志产生的。

undo log 的MVCC的版本控制

mvcc多路并发的版本控制, 简单理解就是,为了标记数据的更新的版本, 创建了两个隐藏列--->

  • 保存行的创建版本

  • 保存行的 删除版本(更新,删除都可以)

其中对于,自己 InnoDb引擎,产生 Undo log也需要进行持久化的操作, 所以Undo lgo 也会产生Redo log ,由于Undo log 的完整性和可靠性需要Redo log 来保证,因此数据库奔溃的时候,

需要先做物理的Redo log数据恢复,然后做Undo log回滚。

おすすめ

転載: juejin.im/post/7032289427346948104
おすすめ