采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,您好,关于在数据更新过程中,undo log的问题: 1.undo log是否也是先写入缓存?是否存在刷盘问题?如果有的话,刷盘时机和redo log一样吗? 2.多个更新命令执行到一半,事务回滚了,undo log除了执行数据回滚外,日志本身要如何处理?抛弃掉吗?
1这个问题非常好,因为undo比较特殊,视频里没有细讲:
对于innodb来说,undo是写在表空间的回滚段的undo page上,也就是说,undo本质上是数据,写undo和更新数据页是一样的。
写undo时,也会为undo本身产生redo log(不涉及server层,不产生binlog)。所以undo log刷盘 和 数据刷脏是一样的操作。
所以undo的刷盘时机和数据是一样的,也是先写入缓存。因为有了redo,只要undo相关的redo刷了盘,undo就不着急刷盘了。
2undo就像你删除数据一样,被删掉了。(但是innodb删数据的时候会有优化,先标记一下删除,再异步慢慢清理)
关于回滚时的操作,按说undo作为一种数据,已经写入了redo的缓存中,那此时redo中,按一种我假设的结构,应该有两种类型的日志,一类是真实的表数据操作日志,一类是undo数据操作日志。回滚删除时,undo标记为删除,等待异步操作,是在redo中新增了删除日志,然后再统一刷盘吗?描述的有点乱,不知道是不是这么个设计?
前面说的对的。后面补充一点:删除undo时,不光会记录redo,还会在undo的实际数据上(内存中)打一个删除标记。刷脏时,不是把undo删掉,而是把这个删除标记刷进去,刷进去之后相应的redo就能清掉了。然后另外还有一个异步线程会寻找这些删除标记,清理磁盘上的数据。删除其他数据也是这样的步骤。
好的,谢谢老师
登录后可查看更多问答,登录/注册
从数据库原理到高性能实战,一次性涵盖
770 16
782 8
893 7
1.1k 6
746 6