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-多版本并发控制

读取数据的时候使用一种类似于快照的方式将数据保存下来,通过readview不同的事物只能看到自己对应可见的版本,提高并发性能。

使用条件

mysql数据库隔离级别是以下两个:

  1. READ COMMITED (读已提交)
  2. REPEATABLE READ (可重复读)

实现原理

Mysql通过隐藏字段、undo log、readview实现MVCC多版本并发控制。

隐藏字段

InnoDB 存储引擎为每行数据添加了三个 隐藏字段:

  1. DB_TRX_ID(6字节):表示最后一次插入或更新该行的事务 id。此外,delete 操作在内部被视为更新
  2. DB_ROLL_PTR(7字节) 回滚指针,指向该行的 undo log 。如果该行未被更新,则为空,查询以前的版本
  3. DB_ROW_ID(6字节):如果没有设置主键且该表没有唯一非空索引时,InnoDB 会使用该 id 来生成聚簇索引
undo log

mysql三大日志之一,用于记录当前事物对数据做了什么,相当于一个快照,用于回滚操作。另一个作用是 MVCC ,当读取记录时,若该记录被其他事务占用或当前版本对该事务不可见,则可以通过 undo log 读取之前的版本数据,以此实现非锁定读

readview

readview

主要有四个字段

  1. m_ids:表示在生成readview时,当前系统中活跃的读写事务id列表,就是未提交的事物,如果直接读取会导致脏读。
  2. min_trx_id:表示在生成readview时,当前系统中活跃的读写事务中最小的事务id,也就是m_ids中最小的值;如果事物id小于当前id号,则可见。
  3. max_trx_id: 表示生成readview时,系统中应该分配给下一个事务的id值;大于等于该事物id都不可见。
  4. creator_trx_id:创建该 Read View 的事务id
readview 的两种情况

在不同的隔离级别条件下,readview创建方式也不一样,在READ COMMITED条件下,每次读取操作都会创建新的readview,readview是不断变数的,可能会在读取过程当中有新的数据提交而导致不可重复读REPEATABLE READ每次会生成一个readview,在该事物过程中不会在重新创建readview,因此不会导致读取到新提交的数据,避免了不可重复度

过程如下:
总的来说判断就三个条件:
undo log的数据中包含的trx_id是否符合min_trx_id和max_trx_id之间
1.1 如果小于min_trx_id说明创建RV 之前 的时候这个trx_id就已经事务提交了,不活跃了,说明可以读。
1.2 如果大于max_trx_id说明这个版本是在创建RV 之后 产生的,不可读。因为创建RV时你这个版本还不存在。
1.3 如果是在这之间的再看步骤2
查看trx_id是否包含m_id之中:
2.1 包含说明创建RV的时候,还是活跃(没提交)事务。那么是不可见的,脏读;继续看步骤3
2.2 不包含说明创建RV之前这个事务已经被提交了,那么是可见的。
到了这里说明这条数据的变更版本在RV之内,则要查看creator_trx_id与trx_id是否一致:
3.1 一致说明就是当前事务创建的;允许使用;
3.2 否则说明是当前RV的其他事务操作的不能使用;

正式在1到2步骤之间,产生的不可重复读问题,如果中间更新了readview,就会读取到新的提交的数据,如果没有更新,就不是读取到,避免了不可重复度。
示意图
参考:
Mysql隔离级别之MVCC的ReadView的理解
InnoDB存储引擎对MVCC的实现

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

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