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机制

前言

mvcc

MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。简单来说,每条数据其实都有两个隐藏字段,一个是trx_id,一个是roll_pointer,trx_id就是最近一次更新这条数据的事务id,roll_pointer就是指向更新这个事务之前生成的undo log(这里不展开叙述)

下面举个栗子:

  1. 事务A在之前插入了一行数据,值是A,事务已提交。会出现下图所示的结构请添加图片描述

  2. 事务B再次修改这行数据,变更为值B,会出现下图所示的结构,B的这行的roll_pointer会指向刚刚的事务A的undo_log请添加图片描述

  3. 事务C再次修改这行数据,变更为值C,C的这行的roll_pointer会指向刚刚的事务B的undo_log请添加图片描述

多个事务串行执行的时候,每个人修改了一行数据,都会更新隐藏字段txr_id和roll_pointer,同时之前多个数据快照对应的undo log,会通过roll_pinter指针串联起来,形成一个重要的版本链!

readview

执行一个事务的时候,会生成一个ReadView,里面比较关键的东西有4个
一个是m_ids,MySQL里执行还没提交的,换句话说就是活跃的事务
一个是min_trx_id,就是m_ids里最小的值;
一个是max_trx_id,下一个要生成的事务id,就是最大事务id;
一个是creator_trx_id,当前这个事务的id

Read Committed隔离级别

定义

简称为 RC,一句话总结。 事务运行期间,只要别的事务修改数据提交了,就可以读到别的事务修改的数据。当你事务处于RC隔离级别的时候,他是每次发起查询,都重新生成一个ReadView!

解读

举个栗子:
请添加图片描述

目前有一个事务A已提交,值为A。 然后现在活跃着两个事务,一个是事务B(id=20),一个是事务C(id=30),此时事务B将这行数据更新为B,如上图所示。然后事务C发起查询,此时会生成一个readview,min_trx_id=20,max_trx_id=31,creator_trx_id=30,m_ids in (20,30)。发现当前这条数据的trx_id是20。也就是说,属于ReadView的事务id范围之间[20,31],说明是他生成ReadView之前就有这个活跃事务,是这个事务修改了这条数据的值,但是此时这个事务B还没提交,所以ReadView的m_ids活跃事务列表里,是有[20, 30]两个id的,所以此时根据ReadView的机制,此时事务C是无法查到事务B修改的值B的。

然后会顺着undo_log版本链往下找,找到trx_id=10这条记录,小于[20,31]数组的,证明是开启readview前的已提交事务,因此可以查到这个值A

下一步,事务B提交了,事务C再次发起查询,生成的readview,事务B不在活跃数组里了,min_trx_id=20,max_trx_id=31,creator_trx_id=30,m_ids in (30),活跃事务列表里会有一个30,因此顺着undo_log版本链往下查询,值B这条数据就被查出来。

Read Repeatable 隔离级别

定义

RR级别下,一个事务读一条数据,无论读多少次,都是同一个值,同一个readview,就算别的事务修改数据后重新读,还是原来的值。

解读

我们沿用刚刚的案例的这一步

下一步,事务B提交了,事务C再次发起查询

此时生成的readview是什么呢?因为是RR级别,生成readview是跟第一次查询是一样的, min_trx_id=20,max_trx_id=31,creator_trx_id=30,m_ids in (20,30)。活跃事务列表里存在(20,30),因此这两条数据都不会被查出来,顺着undo_log版本链往下查询,最终值A这条数据被查出。
请添加图片描述

如何解决幻读

假设现在事务A已提交,事务BC正活跃,事务C先用select count(*) from x where id > 0 来查询,此时可能查到的就是一条数据,读到的是这条数据是trx_id = 10的版本。然后事务B提交了,事务C再次执行查询,因为第一次查与第二次查的readview是一样的,trx_id = 20 还是在活跃事务中,此行数据不可见。所以事务C还是只能查到 trx_id = 10 这行数据

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 13:54:36  更:2021-10-07 13:54:44 
 
开发: 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 0:59:44-

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