redoLog
- redo log叫做重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。
- mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Buffer Pool(缓冲池)里头,把这个当作缓存来用。然后使用后台线程去做缓冲池和磁盘之间的同步。
- redo log是用来恢复数据的 用于保障,已提交事务的持久化特性
undoLog
- undo log 叫做回滚日志,用于记录数据被修改前的信息。他正好跟前面所说的重做日志所记录的相反,重做日志记录数据被修改后的信息。undo log主要记录的是数据的逻辑变化,为了在发生错误时回滚之前的操作,需要将之前的操作都记录下来,然后在发生错误时才可以回滚。
- undo log 记录事务修改之前版本的数据信息,因此假如由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态。
- undo log是用来回滚数据的用于保障 未提交事务的原子性
flush
redo log把数据刷到磁盘,这个操作就称之为flush
- 在更新之前,当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。
- 内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页“。

flush时机:1.redo log写满的时候 2.内存页不足的时候 3.系统空闲的时候 4.mysql正常关闭的时候
视图
在MySQL里,有两个“视图”的概念:
- 一个是view,它是一个用查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果。创建视图的语法是create view … ,而它的查询方法与表一样。
- 另一个是InnoDB在实现MVCC时用到的一致性读视图,即consistent read view,用于支持RC(Read Committed,读提交)和RR(Repeatable Read,可重复读)隔离级别的实现
只有可重复和读已提交会创建视图
版本链
每个事务都有一个叫做transaction_id的事务id,每次事务都会生成一行新的记录把transaction_id赋值给row_trx_id,同时旧版本保留,每次都会把旧版本写入到undo日志中,用roll_pointer指向旧版本,这两个参数都在聚簇索引中,大致结构如下所示
MVCC(Multi-Version Concurrency Control ,多版本并发控制)
所谓的MVCC就是指在使用读已提交、可重复读这两种隔离级别在执行select操作时访问版本链的过程
读已提交
在读已提交级别下,这个视图在每个sql语句开始执行的时候创建,在这个隔离级别下事务每次查询都会生成一个ReadView
可重复读
可重复读只在第一次读取数据时生成ReadView,所以一个事务的查询结果每次都是一样的
解决幻读
当前读
select…for update,update , delete , insert
实现:间歇锁(gap),锁住一定范围内的数据,比如3
快照读
单纯select操作
实现:利用undolog和MVCC
事务的实现
- 事务的原子性是通过 undo log 来实现的
- 事务的持久性性是通过 redo log 来实现的
- 事务的隔离性是通过 (读写锁+MVCC)来实现的
- 一致性是通过原子性,持久性,隔离性来实现的
原子性
一个事务必须被视为不可分割的最小工作单位,一个事务中的所有操作要么全部成功提交,要么全部失败回滚,对于一个事务来说不可能只执行其中的部分操作,这就是事务的原子性。
- 每条数据变更操作都伴随一条undo log生成,并且回滚日志优先于数据持久化到磁盘上
持久性
事务一旦提交,其所作做的修改会永久保存到数据库中,此时即使系统崩溃修改的数据也不会丢失。
Mysql缓存机制:
- 读数据:会首先从缓冲池中读取,如果缓冲池中没有,则从磁盘读取在放入缓冲池;
- 写数据:会首先写入缓冲池,缓冲池中的数据会定期同步到磁盘中;
但这样写数据在机器宕机时会丢失,于是就有了redo log,在事务执行过程中就产生redolog
既然redo log也需要存储,也涉及磁盘IO为啥还用它?
- redo log 的存储是顺序存储,而缓存同步是随机操作。
- 缓存同步是以数据页为单位的,每次传输的数据大小大于redo log。
隔离性
通过MVCC,运用读写分离的思想实现
读未提交
读已提交
可重读读
序列化
一致性
数据库总是从一个一致性的状态转移到另一个一致性的状态.
- 通过回滚,以及恢复,和在并发环境下的隔离做到一致性。
参考:
https://mp.weixin.qq.com/s/jrfZr3YzE_E0l3KjWAz1aQ
https://mp.weixin.qq.com/s/0-YEqTMd0OaIhW99WqavgQ
