请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

undo log在数据更新时的相关问题

老师,您好,关于在数据更新过程中,undo log的问题:
1.undo log是否也是先写入缓存?是否存在刷盘问题?如果有的话,刷盘时机和redo log一样吗?
2.多个更新命令执行到一半,事务回滚了,undo log除了执行数据回滚外,日志本身要如何处理?抛弃掉吗?

正在回答 回答被采纳积分+3

1回答

Moody 2021-12-01 17:06:22

1这个问题非常好,因为undo比较特殊,视频里没有细讲:

对于innodb来说,undo是写在表空间的回滚段的undo page上,也就是说,undo本质上是数据,写undo和更新数据页是一样的。

写undo时,也会为undo本身产生redo log(不涉及server层,不产生binlog)。所以undo log刷盘 和 数据刷脏是一样的操作。

所以undo的刷盘时机和数据是一样的,也是先写入缓存。因为有了redo,只要undo相关的redo刷了盘,undo就不着急刷盘了。

2undo就像你删除数据一样,被删掉了。(但是innodb删数据的时候会有优化,先标记一下删除,再异步慢慢清理)

0 回复 有任何疑惑可以回复我~
  • 提问者 慕丝2361510 #1
    关于回滚时的操作,按说undo作为一种数据,已经写入了redo的缓存中,那此时redo中,按一种我假设的结构,应该有两种类型的日志,一类是真实的表数据操作日志,一类是undo数据操作日志。回滚删除时,undo标记为删除,等待异步操作,是在redo中新增了删除日志,然后再统一刷盘吗?描述的有点乱,不知道是不是这么个设计?
    回复 有任何疑惑可以回复我~ 2021-12-01 19:23:22
  • Moody #2
    前面说的对的。后面补充一点:删除undo时,不光会记录redo,还会在undo的实际数据上(内存中)打一个删除标记。刷脏时,不是把undo删掉,而是把这个删除标记刷进去,刷进去之后相应的redo就能清掉了。然后另外还有一个异步线程会寻找这些删除标记,清理磁盘上的数据。删除其他数据也是这样的步骤。
    回复 有任何疑惑可以回复我~ 2021-12-01 22:43:08
  • 提问者 慕丝2361510 #3
    好的,谢谢老师
    回复 有任何疑惑可以回复我~ 2021-12-01 23:04:12
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信