持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 11 天,点击查看活动详情
哈喽,大家好,我是二毛。
相信大部分小伙伴刚学完 Mysql 的增删改查语法之后,再进行深入学习的话,就会碰到各种日志,比如 undoLog/binLog/redoLog 等,那么这些日志分别是什么,又可以用来做什么呢?
今天这篇文章带你先解决下什么是 undoLog 这个疑问。
undoLog
是什么
顾名思义,就是“不做日志”,那么不做什么呢?在 Mysql 就是不做 sql 执行,结合一下就是:不执行SQL前的数据情况。
引用下官方的解释:
MySQL(存储引擎需要能支持事务)在修改记录之前(提交事务之前),会把原先记录的值先保存起来(也就是写入到undo log),然后再修改(提交事务),当出问题的时候MySQL可以利用undo log来回滚事务,即恢复原先的记录值。
undo log由InnoDB的存储引擎层产生,是InnoDB 存储引擎特有的(和redo log一样)。
undo log属于逻辑日志。
做什么
1 事务回滚
前面也提到了,undoLog 是可以用来进行事务的回滚的,从而保证事务的原子性。
比如:执行一条 insert 语句:
insert into user values(1, '程序员二毛', '掘金优秀创作者&百大UP主')
那么 undoLog 就会记录与他想法的语句,也就是 delete:
delete from user where id = 1
2 MVCC
MVCC全称即 Multi-Version Concurrency Control,即:多版本并发控制。
在MySQL的InnoDB存储引擎中,用版本号把 undoLog 串联起来,从而形成版本链,从而实现MVCC。
举个例子,当我们读取的某一行被其它事务锁定的时候,InnoDB可以从undo log中分析出该记录历史版本的数据,从而让我们可以读取到当前事务操作之前的数据(也就是快照读)。
最后
本文主要跟大家介绍了 undoLog 的概念,以及作用:1事务回滚;2 MVCC。
希望对大家有帮助。
我是二毛,我们下期再见~