MySQL之undo日志

362 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

上篇文章讲到redo log重做日志保证了是万物的持久性,本篇文章来和掘友们分享下undo log回滚日志是如何保证事务的原子性,对于数据层面来说,比如我写的java代码当我们的transaction事务提交时如果发生错误那么数据库数据不改变,如果成功那就改变,到底是如何做到的呢?本篇文章我来探讨下undo log回滚日志的执行流行与原理。

undo log

  1. undo log的作用: 保证事务的原子性由undo log回滚日志来完成,undo log日志第一个作用是可以回滚数据,第二个作用是可以用在一致性非锁读上(也就是mvcc)。

2.undo log的结构: 简单来说undo log采用的是回滚段的方式来管理,每个回滚段我们只需要记住几个概念即可,回滚段号,上一个回滚段号,回滚体,举个例子假设有一条记录,初始值为1,然后一个事务内修改2次,update1修改为2,update2修改为3,那么对应的undo log回滚视图如下:

image.png

对应的,如果事务需要回滚则根据当前事务undo版本链回滚到即可。

3.undo log的类型: undo log日志从数据类型分为两种,insertupdate,对于新增的数据就是insert类型,对于修改、删除就是update类型。

4.undo log的数据分类:undo log日志的数据分类分为三种,

  1. 未提交的数据。
  2. 已经提交且过期的。
  3. 已经提交未过期的。

5.undo log的删除:对于新增类型的undo log日志来说,新增的数据只有本事务可见,所以可以直接提交,对于修改类型的undo log日志来说,由于需要支持mvcc,可能会其他事务,所以不能直接删除。

redo log 与 undo log 的区别

redo log重做日志与undo log回滚日志一个是记录对数据的操作用于恢复数据另一个是记录之前的数据用于回滚到之前的某个版本的数据,那么是不是可以简单的认为他们是相反作用的日志呢?对于不好理解的掘友可以简单这样子比喻,但是redo log日志记录的是物理上的修改比如对于某个数据页的某条记录做了某些修改,数据页上的数据对应着磁盘上的数据,对于undo log日志来说是对于修改操作的反记录,比如我insert语句新增数据那么undo log就会记录一条delete删除数据语句,如果是修改语句那就会生成一条反修改的update语句因此undo log回滚日志是逻辑上的。