IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL的MVCC底层原理 -> 正文阅读

[大数据]MySQL的MVCC底层原理

MySQL的MVCC底层原理

图1
图1
这是一个account表?有id和name字段
图2
图2
MySQL底层会给表添加2个字段?
一个是trx?id(事务id)
一个是roll?pointer(回滚指针)

事务id

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

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

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

图4
图4

第一个事务

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

第二个事务

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

第三个事务

开启事务
做一个更新account表的操作
update?accout?set?name='平凡人笔记'?where?id?=?1
生成一个事务id?假设为300
图5假设这是更新之前的数据
图5假设这是更新之前的数据

执行更新操作

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

执行时序图中第9步

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

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

图8
图8

此时有了版本链和readview

图9
图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
图10
插入一条name为"平"的数据?事务id为100

时序图11

update?account?set?name='凡'?where?id?=1;
图11
图11
插入一条name为"凡"的数据?事务id为100

时序图第12步

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

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

  • 如果是可重复读的话 它的read-view就是沿用了当前查询事务第一次查询的时候的readview
图12
图12
  • 如果是读已提交 在每次select的时候都会按最新的情况再生成一次
目前分析的可重复读机制?所以第12步的时候?readview还是[100,200],300

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

图13
图13

MySQL底层有一个比对规则

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

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

此时要结合版本对比规则

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

那么将会有自己的事务id假设为400
那么这个事务id也会在readview[100,200,400],300
未提交事务数组中
而且跟当前自己的事务id是一样的?那是可见的
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:22:04  更:2021-11-28 11:23:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:27:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码