目录
-
前期回顾
-
什么是undo log
-
undo log 结构怎样的
-
什么是 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 ,咱们下期在来说这个玩意。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
欢迎关注