(1)回顾:
redo log 都是先进入redo log buffer 中的一个block,然后事务提交的时候就会刷入磁盘文件里去,这样万一提交事务了,结果事务修改的缓存页还没来的及刷入磁盘上的数据文件,此时MySQL关闭了或者宕机了,buffer pool里被事务修改的数据就会全部丢失!
但是只要有redo log,重启MySQL之后完全是可以把那些修改的缓存页 但缓存页还没来得及刷入磁盘的事务 所对应的redo log 加载出来,在buffer pool 的缓存页里重做一遍,就可以保证事务提交之后,修改的数据绝对不会丢。
(2)事务执行的一半要回滚怎么办?
比如一个事务里有4个增删改操作,结果目前为止执行了2个增删改SQL,已经更新了一些buffer pool里的数据,但是还有2个增删改SQL的逻辑还没执行,此时回滚事务怎么办?
无论是插入,还是更新,还是删除,该做的都做了,这时候就有了 undo log 回滚日志这个回滚日志很简单,
比如你要是在缓存页里执行了insert语句,那么此时在undo log日志里,对这个操作的回滚日志就必须是一个主键和一个对应的delete操作,要能让你把
这次insert操作给回退了。
再比如你要是执行update语句,那就把你更新之前的那个值记录下来,回滚的时候重新update一下,把之前更新的旧值更新回去
如果要是select语句,在buffer pool里没做修改,这就不需要undo log
所以在执行事务期间除了写redo log日志还必须写undo log日志,这个undo log日志至关重要,没有他,根本没法回滚事务。<br />![37.jpg](https://cdn.nlark.com/yuque/0/2021/jpeg/232825/1630979507564-585fca95-d905-4d08-b7cb-9203970edd94.jpeg#clientId=u01b1e8c9-310e-4&from=ui&id=u4f3be0b9&margin=%5Bobject%20Object%5D&name=37.jpg&originHeight=616&originWidth=1132&originalType=binary&ratio=1&size=169496&status=done&style=none&taskId=u02f6edf8-506f-4ba0-9f76-7c2cc428a7b)