MySQL的MVCC底层原理

图1
这是一个account表 有id和name字段

图2
MySQL底层会给表添加2个字段 一个是trx id(事务id)一个是roll pointer(回滚指针)

事务id

图3
假设一个事务id为60的事务 往表中插入一条数据 那么这条数据的trx id为当前事务的id 60

注:执行更删改的操作才会生成事务id

接下来详细说下这个时序图(有先后顺序的)

图4

第一个事务

开启事务做一个更新test表的操作做更新的目的是为了生成一个事务id 假设为100

第二个事务

开启事务做一个更新test表的操作做更新的目的是为了生成一个事务id 假设为200

第三个事务

开启事务做一个更新account表的操作update accout set name='平凡人笔记' where id = 1生成一个事务id 假设为300

图5假设这是更新之前的数据

执行更新操作

图6
先在MySQL表中插入一条记录同时把之前的那条记录放到undo log日志(回滚日志)中新数据中的roll pointer(回滚指针要指向老的那条数据)

执行时序图中第9步

MySQL在第一次执行查询语句的时候select name from account where id =1会生成一致性视图 叫 read-view(快照视图)这里面是当前发起的这个查询的时候所有未提交的事务id数组以及截止目前已创建(包含已提交和未提交)的最大的事务id

图7

根据以上规则得出第9步首次查询的时候read-view是[100,200],300

图8

此时有了版本链和readview

图9
根据生成的readview去版本链中从最新的记录按照一定的规则逐步去找应该显示出来的记录

图8中的查询这一步骤(对应时序图中的第9步)查询结果

事务id=100的这个事务未提交事务id=200的这个事务未提交事务id=300的这个事务(update accout set name='平凡人笔记' where id = 1)提交了

那么结果就是 “平凡人笔记”了

接着看时序图第10

update account set name='平' where id =1;

图10
插入一条name为"平"的数据 事务id为100

时序图11

update account set name='凡' where id =1;

图11
插入一条name为"凡"的数据 事务id为100

时序图第12步

select name from account where id =1这一步的查询 也有一个read-view

此时要根据数据库的隔离级别来判断read-view的内容

  • 如果是可重复读的话 它的read-view就是沿用了当前查询事务第一次查询的时候的readview

图12
  • 如果是读已提交 在每次select的时候都会按最新的情况再生成一次
目前分析的可重复读机制 所以第12步的时候 readview还是[100,200],300

此时MySQL拿着read-view到最新的版本链逐个去比对查询

图13

MySQL底层有一个比对规则

readview未提交事务数组中最小的事务即min_id=100已创建的最大的事务id即max_id=300

将所有的事务id分为3个部分

图14
  • 绿色部分 <min_id=100
绿色部分的事务id比未提交事务数组中的最小的事务id还要小那么绿色部分的事务肯定已经提交了
  • 黄色部分 >=100 && <=300
  • 红色部分 >300
继续看图13先拿到最新的数据 

发现它的事务id是100

此时要结合版本对比规则


假设这个select事务有执行过update语句


那么将会有自己的事务id假设为400那么这个事务id也会在readview[100,200,400],300未提交事务数组中而且跟当前自己的事务id是一样的 那是可见的

MySQL的MVCC底层原理相关推荐

  1. MySQL的MVCC底层原理二

    承接上文MySQL的MVCC底层原理 上文说到时序图中的第12步这篇文章咱接着聊完 时序图 图1 时序图第12步中的查询事务的read-view情况 图2 read-view为[100,200],30 ...

  2. MySQL MVCC底层原理详解

    1 简介         MVCC(Multi-Version Concurrency Control)多版本并发控制,是用来在数据库中控制并发的方法,实现对数据库的并发访问用的.在MySQL中,MV ...

  3. 为了把mysql的索引底层原理讲清楚,我把计算机翻了个底朝天

    来自:非科班的科班 什么是索引 概念:索引是提高mysql查询效率的数据结构.总的一句话概括就是索引是一种数据结构. 数据库查询是数据库的最主要功能之一.设计者们都希望查询数据的速度能尽可能的快,因此 ...

  4. MySQL 工作、底层原理

    mysql原理图各个组件说明 1. connectors 与其他编程语言中的sql 语句进行交互,如php.java等. 2. Admin & Tools  和 Enterprise Serv ...

  5. 面试官问我MySQL事务的底层原理?幸亏我总结了全套八股文

    迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"我爱加班". 面试开始,直 ...

  6. 阿里二面:了解 MySQL 事务底层原理吗

    你好,我是坤哥,今天是国庆最后一天,不知大家是否玩得尽兴,我基本在家带娃了,累得半死,顺带肝了一篇文,来自读者曾经在阿里的面试题,希望对大家有帮助,另外也欢迎大家加我微信「geekoftaste」,一 ...

  7. mysql 字符串 底层_Mysql 的索引底层原理及数据结构详解

    Mysql 的索引底层原理 1.什么是索引? 索引是一种排好序的数据结构,mysql目前默认使用的是b+树. 2.为什么使用b+树? 例如表table 数据 id name 1 zs 2 ls 3 s ...

  8. MySQL分库分表原理

    分库分表原理 前言 垂直拆分 水平拆分 分库分表后引入的问题 分库分表中间件 前言 在互联网还未崛起的时代,我们的传统应用都有这样一个特点:访问量.数据量都比较小,单库单表都完全可以支撑整个业务.随着 ...

  9. 理解mysql 底层原理

    理解mysql 底层原理 mysql 关系数据库的一种,开源免费,支持百万级的存储性能.性能稳定.社区活跃 鉴于 本人半路出家,对于一些原理的东西都不怎么了解,正好 无所事事的情况下,翻博客,吸取知识 ...

最新文章

  1. Docker默认网络管理
  2. DOM编程以及domReady加载的几种方式
  3. visio studio json工具_《产品经理入门指南》彩蛋2:别技淫原型图!你的Visio和Balsamiq Mockup入门了吗?...
  4. python3 判断大小端的一种方法
  5. bottle模板中的替换
  6. Linux 下安装配置 JDK7
  7. java gb28181网关_视频网关GB28181协议转换解决方案
  8. FireMonkey动画进度条实现
  9. 谷歌浏览器86版_Google 谷歌浏览器 Chrome v87.0.4280.66 Win Mac Linux 安卓等稳定版
  10. win10下 phantomjs下载安装与使用
  11. vivo手机系统打印服务器,原来vivo手机自带扫描功能,文件瞬间电子化!几千的扫描仪省下了...
  12. geany设置运行linux,Linux强大IDE——Geany配置说明
  13. iVMS-4200 Vs区别_44751红单足球预测 法甲 21:00 安格斯 VS 梅斯
  14. 钉钉走出国门,火遍全球离不开它的支持
  15. 怎么用计算机算出出生日期,算农历出生日期计算器,根据出生日期怎么算年龄?...
  16. Oracle——获取当前系统时间以及插入日期型数据(to_date的用法)
  17. 上手即用亏大了!教你发掘Win10真正的好用之处
  18. MacOS : 大前端必备姿势(工作环境)
  19. linux系统路由器地址查询,如何在任何平台上查找路由器的IP地址
  20. 正则表达式的相关操作和验证

热门文章

  1. Vue —— vuex
  2. mysql配置master_mysql 主从配置(master/slave)
  3. 【Leetcode】102. 二叉树的层次遍历
  4. linux 下创建GRE隧道
  5. sqlite3使用sqlite2创建的数据库
  6. Google Hacking技术
  7. 校外访问不了cgbt.cn(403 forbidden)解决办法
  8. PHP 制作通讯录(六)
  9. 读取properties资源文件中的参数
  10. Redis学习笔记01---配置文件