「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」
Undo Log日志是何许人也
MySQL事务中,主要的功能特性,依赖于 Undo log ,因为四个特性
-
原子性, 持久性----> Redo log
-
隔离性 ----->MVCC机制和锁
-
一致性 ----->Undo log
因为 Undo log 在Mysql事务实现中,主要有两方面,
-
- 多版本的并发事务控制-MVCC版本
-
-
回滚事务
-
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回滚。