MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性
哪位大神可以展开讲讲:
- redo log(重做日志) 如何保证事务的持久性?
- undo log(回滚日志) 如何来保证事务的原子性?
MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性
哪位大神可以展开讲讲:
4 回答1.2k 阅读✓ 已解决
8 回答1.2k 阅读
3 回答1k 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.2k 阅读
1 回答856 阅读✓ 已解决
1 回答649 阅读✓ 已解决
MySQL怎么保证持久性?
保证持久性,其实很简单,只用把该事务在内存中修改的全部页面刷新到磁盘就可以了,但是,这些页面可能并不相邻,需要进行很多随机IO,对于传统的机械硬盘就会特别慢,所以,为了提升效率,设计MySQL的大叔就引入了redo log,它只用来保存事务对数据页所做的修改,
比如,当一条记录需要更新时,Innodb引擎会先把对这个数据页的修改 写到redo log buffer中,事务提交时再把redo log buffer刷到磁盘文件redo log中,这样是追加写,顺序IO速度很快.
我想你一定会问, 那什么时候更新到磁盘上的数据页呢?
你可能还会问, 那不及时刷到硬盘上不会导致下次读出来的还是旧数据吗?
你可能还会问, 那只用内存里的数据那宕机了咋办?
MySQL怎么保证原子性?
原子性指的是事务中的所有操作是一个不可分割的整体, 要么全做, 要么全不做.
利用Innodb引擎的undo log(回滚日志),它记录了回滚一个操作必需的内容
比如,当你update一条数据的时候,就需要这条记录的原始值,回滚的时候,把这条记录再update为原始值
这样,当事务执行失败,就可以根据undo log回滚之前执行成功的操作