当前位置: 首页 > article >正文

MySQL 初阶——多版本控制 MVCC

一、版本链(undo 日志)

a. 什么是版本链

版本链就是一条以事务为节点的单链表。其 next 指针指向前一个版本的事务。

b. 版本链的增删

当一个事务被完成时,这个事务就会被加入到版本链里去;当要回滚时,版本链就会删除一些节点,使得头节点是回滚后的事务的上一个旧版本。而如果要更新 MySQL 中的表的内容时,更新前的内容会被拷贝一份并加入版本链里面,然后再改表的内容,最后把这个事务 ID 在原来的旧版本上加 1.

举个例子,假如现在已经有这个记录:

1. 我们现在要把这个记录中的名字改成 “李四” ,要经过以下步骤:

步骤一:标题把原记录拷贝一份到 undo 日志中(添加到版本历史链中)

步骤二:修改 name,事务 ID 和回滚指针,使其这向上一个版本的记录

再举个例子,假如我们要接着把“李四”的那条记录里的年龄改成 38 岁,也还是继续以下操作:

步骤一:把李四那条记录拷贝一份到 undo 日志中(添加到历史版本链里)
步骤二:修改年龄、事务 ID和回滚指针的指向,使其指向上一个版本的记录

二、如何通过版本链实现多版本控制

a. 如何实现回滚?

其实原理很简单,就是把上一个版本的记录从 undo 日志拿出来,覆盖到当前版本上就行了。举个例子,假如我要回滚到最开始那条记录:

最开始的那条记录

此时历史版本链为这样:

 那么 MySQL 就会按一下步骤运行:

步骤一:第一次回滚
步骤二:第二次回滚,回滚完成

b. 历史版本链如何存插入、删除操作的事务 

其实也很简单,在拷贝记录时,如果是插入操作,就把进入 undo 日志的那条记录标记为删除操作;如果是删除操作,就把进入 undo 日志的那条记录标记为插入操作。到时候回滚时直接按着所记录的操作运行就行了。


http://www.kler.cn/news/359876.html

相关文章:

  • Tkinter -- python GUI学习与使用
  • 1.前提配置 关防火墙 关selinux
  • 每日一题|910.最小差值II|数组排序思路、单调性
  • 深入理解Python函数
  • SAP B1 账套锁定解决方案
  • 【渗透测试】-红日靶场-获取web服务器权限
  • Linux -- 命名管道
  • ansible——ansible的变量
  • Typescript中的Required,Partial,Pick,Omit辅助类型
  • Python爬取站长素材图片【爬虫学习day.01】
  • Android Framework关闭触摸振动
  • Vue笔记-浏览器窗口改变时,重新计算表格高度并设置
  • 【OpenCV】人脸识别方法
  • 32.第二阶段x86游戏实战2-遍历技能2(技能二叉树基址)
  • WPF中的<Style.Triggers>
  • 项目管理软件真的能让敏捷开发变得更简单吗?
  • 【2024CANN训练营第二季】使用华为云体验AscendC_Sample仓算子运行
  • 【华为HCIP实战课程十六】OSPF虚链路Vlink,网络工程师
  • 代码随想录算法训练营第三十一天|56. 合并区间、738.单调递增的数字
  • Typora的使用方法(个人学习笔记)