【高并发基础】理解 MVCC 及提炼实现思想

news2024/9/20 15:01:29

文章目录

    • 1. 前言
    • 2. MVCC 概念
      • 2.1 MVCC 版本链
      • 2.2 MVCC trx_id
      • 2.3 MVCC Read View
    • 3. 提出问题
    • 4. 解决问题
      • 4.1 不读未提交的数据
        • 4.1.1 一般的并发情况
        • 4.1.2 特殊的并发情况
        • 4.1.3 剩下的并发情况
      • 4.2 如果自己修改了数据,要第一时间读到
    • 5. MySQL RC 使用 MVCC
      • 5.1 MVCC DML 会生成新的 Read View 吗?
      • 5.2 MySQL RC 建立 Read View 的时机
    • 6. MySQL RR 使用 MVCC
      • 6.1 MySQL RR 建立 Read View 的时机
    • 7. 提炼 MVCC 的思想
    • 8. 后记

1. 前言

MVCC 在 MySQL、Oracle、PostgreSQL 都有应用,用于实现事务的隔离特性。现在结合 《MySQL是怎样运行的》的内容理解、归纳、整理下MVCC的实现及思想。

2. MVCC 概念

Multiversion Concurrency Control 对版本并发控制。
对于同一行数据,会根据不同事务的DML操作参生不同的版本,让不同事务各自维护自己能看到的版本从而做到事务隔离。

2.1 MVCC 版本链

每次操作数据库都会生成日志,那么就可以把同一条记录的多次操作记录按时间顺序链接起来。
在这里插入图片描述

以上图片参考博客

2.2 MVCC trx_id

按事务开启的时间顺序,为事务颁发一个Id,从而维护“版本”。是讨论MVCC实现的基础。

2.3 MVCC Read View

光有日志记录还不够,每个事务应该要维护自己的 “视野范围”。也就是当前事务到底能看到什么版本的数据,建立 Read View,并与版本链协作,就能约束事务的视野,从而实现隔离。
Read View 包含:

  1. m_ids
  2. min_trx_id
  3. max_trx_id
  4. creator_trx_id

Read View 里面有多个属性,他们是分别用于解决不同问题的。如果一上来就把四个都搞懂,容易晕。

3. 提出问题

这个事务隔离方案需要回答以下问题:

  • 如何控制当前事务读不到其他事务 未提交 的数据
  • 如果自己事务修改了数据,怎么第一时间读到

回答以上问题后,也顺带把 MySQLRCRR 使用MVCC的原理给理解了

4. 解决问题

我们把日志的 trx_id 与 区间 [min_trx_id, max_trx_id ] 的命中关系罗列出来,用于后续讨论问题

trx_id >= Read View. max_trx_id
Read View. max_trx_id  > trx_id  >=  Read View. min_trx_id
trx_id < Read View. min_trx_id

值得一提的是,

trx_id == Read View. creator_trx_id 

不在区间讨论范围,属于前置判断(这个条件满足了,就不看区间命中情况了)

4.1 不读未提交的数据

4.1.1 一般的并发情况

新引入以下参数:

  • max_trx_id:这个属性容易搞混,它表示系统应该分配给下一个事务的食物Id
    • 即若 creator_trx_id = 3,max_trx_id 一定 > 3

事务生成了 Read View 之后,对数据行进行读取,发现日志中有

trx_id >= Read View. max_trx_id

则说明该日志发生在建立 Read View 之后,并且生成该日志的事务是在当前事务之后开启。
至此,我们能够得到一个信息:该日志发生在当前事务开启之后,可能是还未提交的事务
那么,争取不读未提交的事务,只用做一件事:忽略该日志


4.1.2 特殊的并发情况

新引入两个参数

  • min_trx_id: 当前所有事务中,活跃的(未提交的)事务中 trx_id 最小的一个
  • m_ids: 当前所有事务中,活跃的(未提交的)事务列表

事务生成了 Read View 之后,对数据行进行读取,发现日志中有

Read View. max_trx_id  > trx_id  >=  Read View. min_trx_id

则说明该日志发生在建立 Read View 之后,并且生成该日志的事务是在当前事务之后开启。
对比上文的"一般的情况",max_trx_id指系统下一个要建立的事务Id,若存在以下关系:

Read View. max_trx_id  > trx_id 

说明该日志的事务跟建立 Read View 的时机挨得很近,我们还是可以考虑一下这条日志。具体怎么考虑呢?
m_ids 在 Read View 中负责记录建立 Read View 那一刻的 活跃事务
如果日志中的 trx_id 不在活跃事务列表,侧面说明该日志的事务已经提交,则可以读取它。


4.1.3 剩下的并发情况

trx_id < Read View. min_trx_id

这个比较简单,直接读即可。由于较新的日志一定会置顶,读到 trx_id < Read View. min_trx_id 立马返回数据即可。


4.2 如果自己修改了数据,要第一时间读到

引入以下参数

  • creator_trx_id: Read View 中事务的DML操作会触发建立 trx_id (事务id)
trx_id == Read View. creator_trx_id 

该日志是当前事务的最新语句创建的,直接读取即可。该判断放在了区间命中讨论之前,所以一定会先读到自己更新的数据。
如果开启一个事务,该事务一直没有DML操作,creator_trx_id = 0,即永远不会出现

trx_id == Read View. creator_trx_id 

5. MySQL RC 使用 MVCC

MySQL 会对每个查询语句生成 Read View。

5.1 MVCC DML 会生成新的 Read View 吗?

并不会,DML语句操作语句交给锁处理了,MVCC只是控制读取的数据的版本。
那么DML跟Read View无关吗,当然也不是,上文交代,使用 creator_trx_id 登记自己操作了的数据。

5.2 MySQL RC 建立 Read View 的时机

每个读取操作都会建立一个新的 Read View, 所以存在不可重复读的并发隐患。

6. MySQL RR 使用 MVCC

RR 的隔离级别比 RC 高,其中隔离性的提高本质上就是调整了 Read View 创建的时机

6.1 MySQL RR 建立 Read View 的时机

第一个查询语句生成 Read View,后续的所有查询都 复用这个 Read View,所以每次读取的值,都来源于同一个版本。

7. 提炼 MVCC 的思想

MVCC 在保持隔离性的前提下,尽最大努力去读最新的数据。它不会立即判断数据是未提交的,而是记录下建立 Read View 那一刹那的事务并发情况,交由一套算法去甄别。

  • 怀疑日志是未提交的数据

    • 自己DML操作的数据
      • 由 creator_trx_id 跟进记录并读取
    • 其他事务DML操作的数据
      • 由 trx_id 与 区间 [min_trx_id, max_trx_id ] 的命中关系确认为已提交数据则读取
  • 确认日志是已提交的数据

    • 读最新的版本

上文说的日志,是因为日志承载的是一个思想,MySQL是用 undo log支撑MVCC的,而PostgreSQl则不是。

8. 后记

早期写的 InnoDB 如何避免脏读和不可重复读,是不严谨的地方,现在纠正过来,希望持续学习,不断进步。
MVCC 给我的启示是,我们可以尝试用区间命中的思想去分解问题,当命中关系被完全覆盖,我们可以认为问题被分解完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git使用学习记录(一、前置知识)

Git使用学习记录&#xff08;一、前置知识&#xff09; Git简介 Git 是什么&#xff1f; Git 是目前为止最为先进的分布式版本控制系统&#xff08;分布式版本控制系统没有“中央服务器”&#xff0c;每个⼈的电脑上都是⼀个完整的版本库&#xff0c;⼯作时不需要联网&#xff…

Dynamics 365 Environment Variables(环境变量)的应用

环境变量这个功能很早就有了&#xff0c;但最近才关注到&#xff0c;是个不错的功能&#xff0c;所以写篇介绍下它的应用。 项目里都会有配置实体这么个东西&#xff0c;用于存储各种常量或者与其他系统集成时的各种配置参数&#xff0c;以往我们都是自定义一个实体用来存放&am…

PyTorch 2.0发布了,一行代码提速76%

PyTorch 官方&#xff1a;我们这次的新特性太好用了&#xff0c;所以就直接叫 2.0 了。 前段时间&#xff0c;PyTorch 团队在官方博客宣布 Pytorch 1.13 发布&#xff0c;包含 BetterTransformer 稳定版等多项更新。在体验新特性的同时&#xff0c;不少人也在期待下一个版本的推…

Mysql进阶学习(十)存储过程和函数流程控制结构

Mysql进阶学习&#xff08;十&#xff09;存储过程和函数&流程控制结构存储过程和函数1. 存储过程1.1 创建语法1.2 调用语法1.3 删除存储过程1.4 查看存储过程的信息2. 函数2.1 创建语法2.2 调用语法2.3 查看函数2.4 删除函数3. 存储过程/函数案例4. 流程控制结构4.1. 分支…

心肺运动试验----各类参数分析笔记

1&#xff1a;定义 什么是心肺运动试验&#xff1f; 心肺运动试验(CPET)是一种可以使研究者同时观察患者的心血管系统和呼吸系统对同一种运动应激的反应情况的临床试验。因为&#xff0c;呼吸道的气体交换与循环相关联&#xff0c;可以同时反映心排血量、肺血流以及外周O2的摄…

详解设计模式:命令模式

命令模式&#xff08;Command Pattern&#xff09;也被称为行动模式&#xff08;Action Pattern&#xff09;、事物模式&#xff08;Transaction Pattern&#xff09;&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 命令模式 是一种数据驱动的设计模式。请求以命令…

序列类型(元组()、列表[]、字符串““)、集合类型({}、set())

序列类型 组合数据类型能够将多个同类型或不同类型的数据组织起来 &#xff0c;通过单一的表示使数据操作更有序更容易。根据数据之间的 关系&#xff0c;组合数据类型可以分为三类&#xff1a; 序列类型、集合类型和映射类型。 • 序列类型是一个元素向量&#xff0c;元素之间…

Centos8安装CDH解决不兼容问题

问题 我的配置 系统&#xff1a; centos8 安装包&#xff1a; CDH-5.16.1-1.cdh5.16.1.p0.3-el7.parcel CDH-5.16.1-1.cdh5.16.1.p0.3-el7.parcel.sha cloudera-manager-centos7-cm5.16.1_x86_64.tar.gz manifest.json 在 http://192.168.1.1:7180/ 上通过web分配percel时分配…

Python实现基于内容的协同过滤推荐算法构建电影推荐系统

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 基于内容(Content Based,CB)的推荐算法&#xff0c;根据用户过去是一段时间内喜欢的物品&#xff0c;由…

DHTMLX Spreadsheet JavaScript Pro 5.0

Spreadsheet — Web-Based Spreadsheet Solution 破解版DHTMLX Spreadsheet is a framework-agnostic JavaScript solution that allows you to quickly add an editable Excel-like spreadsheet on a web page. Unlike online services, DHTMLX Spreadsheet allows you to st…

Windows x64隐藏可执行内存

文章目录实现效果实现原理VAD内存什么是VAD内存查看VAD内存VAD属性VAD内存可利用的点x64分页机制W7 x64下任意地址PDT PTE算法W10 x64定位随机化页表基址实现隐藏可执行内存隐藏内存对抗实现效果 驱动程序在Test进程中申请一块内存地址并打印&#xff0c;然后控制台程序在接收到…

Web中的Bias(更新中)

目录前言数据偏见对人们的影响衡量偏见活跃偏差或少数人的智慧数据偏见其他参考文献前言 本文参考Ricardo Baeza-Yates 2018年发表在《Communications of the ACM》的论文Bias on the Web&#xff0c;论文旨在提高人们对网络使用和内容中存在的偏见对我们所有人造成的潜在影响…

Methyltetrazine-PEG4-NHS ester,甲基四嗪PEG4琥珀酰亚胺酯

一&#xff1a;产品描述 1、名称 英文&#xff1a;Methyltetrazine-PEG4-NHS ester 中文&#xff1a;甲基四嗪-四聚乙二醇-琥珀酰亚胺酯 2、CAS编号&#xff1a;1802907-92-1 3、所属分类&#xff1a;Tetrazine 4、分子量&#xff1a;533.54 5、分子式&#xff1a;C24H3…

qt单线程实现顺序事件的处理不卡顿技巧(IDE开发)

需求&#xff1a; 我现在是这样的需求&#xff0c;我正在开发一款嵌入式IDE中&#xff0c;编辑器中光标改变&#xff0c;右侧的符号大纲能对应的改变选中项。 这里的过程是这样的&#xff0c;鼠标位置改变事件函数里&#xff0c;通过光标行号&#xff0c;计算得到当前处于的符…

通过私钥连接腾讯云,实现免密远程登录

一、创建 SSH 密钥 系统提示不会保存私钥&#xff0c;要求用户在 10 分钟之内自行下载私钥&#xff0c;要保存在本地电脑和邮箱里面备用。 二、绑定密钥到云服务器 勾选刚才创建的 SSH 密钥&#xff0c;点击上面的绑定云主机&#xff0c;弹窗中要先找到你云主机的地域&#x…

【计算机毕业设计】74.家教平台系统源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐…

CentosLinux 6.5安装教程

、开始安装Centos6.5&#xff1a;我们选择“inistall system with basic video driver” 注意&#xff1a;这是一种精简系统的安装模式&#xff1a; 1.安装或升级现有的系统&#xff1b; 2.安装系统并使用基本的显卡驱动&#xff1b; 3.进入系统修复模式&#xff1b; 4.从硬盘…

[附源码]Python计算机毕业设计SSM竞赛报名管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【计算机毕业设计】基于jsp网上书店(源代码+论文)

网上书店系统 1.需求分析。 参考设计要求&#xff0c;及可行性的分析&#xff0c;我们确定了如下的需求&#xff1a; 1.数据库设计科学合理。 2.网站主页面简洁美观&#xff0c;可以天蓝色为主色调。 3.网站主页显示各个分类的及总的畅销表、新书榜、推荐榜&#xff0c;显…

Allegro如何锁定器件操作指导

Allegro如何锁定器件操作指导 Allegro上可以锁定器件,避免误操作被移动,具体操作如下 选择fix命令 Find选择Symbols 框选需要锁定的器件 可以看到器件被锁住了 除了这个方法之外,还有另外一种方法锁定器件,选择edit-property Find选择Symbols