当前位置: 代码迷 >> 综合 >> MYSQl深入探索系列二 undo log
  详细解决方案

MYSQl深入探索系列二 undo log

热度:50   发布时间:2023-12-24 23:23:55.0

目录

  1. 前期回顾

  2. 什么是undo log

  3. undo log 结构怎样的

  4. 什么是 undo log 版本链

1 前期回顾

上次我们将了 mysql中的重做日志 redo log的作用以及存储结构等。大家还记得redo log中都记录了那些数据么?

 

图片

 

接下来看下用于事务回滚的undo log

2 什么是undo log

我们在一个事务里执行几条update语句,更新了某个字段,但是事务执行一半需要回滚,此时怎么做了,已经更新了的字段如何回到旧值呢?

 

此时需要将旧值记录到某个地方,当需要回滚的时候从这里根据旧值会写即可。那这个旧值放在那里呢?没错就是undo log日志。

3 undo log 结构怎样的

那undo log 的存储结构是怎样的呢?我们来简单画个图

那 undo log 也是和redo log 刷盘机制一样么?这里还不大一样,因为 redo log 是一种日志文件,而undo log 是中数据文件,5.7以后可以通过innodb_undo_tablespaces 参数设置undo log 独立的表空间。通过innodb_undo_log_truncate 参数开启在线回收功能,即可以热更新。

 

4 undo log 版本链

那既然undo log中保存了旧值用于回滚,那对与同一行数据来说会有多个不同的版本,没错,此时多个版本就构成了版本链。

 

我们来简单画个图:

图片

 

txr_id 和 rol_pinter是2个隐藏数据每行数据都有的。txr_id是本次事务id,指针指向的是之前生成的undo log。通过上图我们对undo log 版本链有个宏观的认识了。

 

疑问

那你们知道undo log这个版本链除了做回滚操作,还有其他的作用么?这里给大家提示下,undo log除了可以做回滚,还可以解决各种并发问题呢!这里给大家引入个名字 mvcc ,咱们下期在来说这个玩意。

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

欢迎关注

  相关解决方案