“redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性”这句话怎么理解?

MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性

哪位大神可以展开讲讲:

  • redo log(重做日志) 如何保证事务的持久性?
  • undo log(回滚日志) 如何来保证事务的原子性?

 

MySQL怎么保证持久性?

保证持久性,其实很简单,只用把该事务在内存中修改的全部页面刷新到磁盘就可以了,但是,这些页面可能并不相邻,需要进行很多随机IO,对于传统的机械硬盘就会特别慢,所以,为了提升效率,设计MySQL的大叔就引入了redo log,它只用来保存事务对数据页所做的修改,

比如,当一条记录需要更新时,Innodb引擎会先把对这个数据页的修改 写到redo log buffer中,事务提交时再把redo log buffer刷到磁盘文件redo log中,这样是追加写,顺序IO速度很快.

我想你一定会问, 那什么时候更新到磁盘上的数据页呢?

MySQL会根据redo log自动在系统空闲时完成更新磁盘数据页的操作, 这个过程也叫做刷盘, 会对MySQL性能有一定影响

你可能还会问, 那不及时刷到硬盘上不会导致下次读出来的还是旧数据吗?

不会的, 你记到redo log buffer的时候, 你这个数据页的内容已经读到内存了, 内存里面的这个数据页的内容已经被更新了, 以后都是都内存中的这个最新版本

你可能还会问, 那只用内存里的数据那宕机了咋办?

这不就体现了redo log的作用, 你对数据页的修改都记录在redo log了, 宕机了根据redo log的内容恢复就好, 默认设置下事务只要提交就会持久化到磁盘文件redo log中

MySQL怎么保证原子性?

原子性指的是事务中的所有操作是一个不可分割的整体, 要么全做, 要么全不做.

利用Innodb引擎的undo log(回滚日志),它记录了回滚一个操作必需的内容

比如,当你update一条数据的时候,就需要这条记录的原始值,回滚的时候,把这条记录再update为原始值

这样,当事务执行失败,就可以根据undo log回滚之前执行成功的操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章