MySQL 运维实战课
张新铭(俊达)
云掣科技资深数据库专家,前淘宝网、支付宝数据库专家
976 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 33 讲/共 41 讲
MySQL 运维实战课
15
15
1.0x
00:00/00:00
登录|注册

31|事务怎么回滚?(下)

你好,我是俊达。
我们接着上一讲,继续介绍 Undo。

Undo 里的链表结构

Undo 里面,存在着好几个链表结构,包括 Undo 页面链表、Undo 日志头链表、Undo 记录链表。

Undo 段页面链表

Undo 段中的页面组成一个双向链表。开始时,Undo 段只有 1 个页面。如果事务中修改的记录数很多,1 个页面无法容纳所有的 Undo 记录,就需要往 Undo 段中添加新的 Undo 页面。Undo 段头部信息中记录了 Undo 页面链表的起点和终点。每一个 Undo 页面的头部信息中,记录了链表中前后相邻的 Undo 页面的地址。通过 Undo 页面链表,可以按正向或逆向的顺序遍历所有 Undo 页面。
下面是一个 Undo 页面链表的示意图。

Undo 日志头链表

Update 类型的 Undo 段,如果一个事务产生的 Undo 记录不多,那么当前事务结束后,这个 Undo 段还可以被后续的事务重用。重用时,会在 Undo 段中生成一个新的 Undo 日志头。一个 Undo 段中的所有日志头结构,组成了一个双向链表。
下面就是一个 Undo 页面中的多个 Undo 日志,通过双向链表连在一起。
当然,一个 Undo 段被重用,需要满足几个条件。
Undo 段只使用了一个 Undo 页。如果一个 Undo 段中的 Undo 页数超过了 1,就不重用这个 Undo 段。
Undo 页面里剩余空间超过页面大小的 1/4。如果 Undo 页面的剩余空间不到页面大小的 1/4,也不重用这个 Undo 段。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. Undo段的链表结构包括Undo页面链表、Undo日志头链表和Undo记录链表,可以按顺序或逆序遍历整个事务的Undo记录。 2. InnoDB在内存中维护了2个Undo段的链表,可以将Undo段加入到缓存的Undo段列表中,以便后续事务重复使用。 3. 临时表所产生的Undo记录会保存到临时undo段中,往临时undo段中写入undo记录时,不需要记录REDO日志。 4. 系统崩溃恢复时,会扫描回滚段,根据回滚段中记录的Undo段数组,读取事务状态,对于未提交的事务进行回滚操作,将数据库恢复到一致的状态下。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 运维实战课》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
大纲
固定大纲
Undo 里的链表结构
Undo 段页面链表
Undo 日志头链表
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部