MVCC:多版本并发控制

news2024/12/23 18:03:00

MVCC

  • 1. MVCC是什么
  • 2. 快照读和当前读
    • 2.1 快照读
    • 2.2 当前读
  • 3. Read View
    • 3.1 Read View中含有什么内容
    • 3.2 ReadView的规则
  • 4. MVCC整体操作流程

1. MVCC是什么

  • MVCC(Multi Version Concurrency Control),多版本并发控制;
  • MVCC用于解决读-写并发问题,避免发生脏读、幻读等问题;
  • MVCC通过数据行的多个版本管理实现并发控制;
  • MVCC使InnoDB的事务隔离级别下一致性读操作得到保证,即在查询一些被其他事务正在修改的数据时,不用进入等待,而是直接读取数据被更新之前的值;
  • 不同数据库对MVCC的实现方式可能不同,且MySQL数据库中只有InnoDB引擎支持MVCC;
  • MVCC的实现依赖于:1)行记录的隐藏字段;2)Undo Log;3)Read View;
  • MVCC只针对读已提交和可重复读两种隔离级别起作用;

2. 快照读和当前读

  • MVCC锁解决的读-写冲突问题中,读指快照读;

2.1 快照读

  • 快照读即一致性读,读取的是快照数据,而非当前最新数据;
  • 不显式加锁的SELECT即属于快照读;
  • 快照读可使得即使存在读-写冲突,也可以在不加锁的情况下,实现并发读,提高并发性能;
  • 快照读基于多版本管理控制,有时读到的不一定是最新数据,有可能是之前的历史版本;
  • 快照读的前提是事务隔离级别不是串行化,否则快照读退化为当前读;

2.2 当前读

  • 当前读指读取最新数据,读取时需要保证其他事务不能对数据进行修改,因此需要对数据加锁;
  • 显式加锁的SELECT或对数据进行增删改操作都会执行当前读;
    在这里插入图片描述

3. Read View

  • MVCC通过Read View管理Undo Log中记录的可见性,确定当前事务需要读取记录的对应版本;
  • 记录中含有三个隐藏字段:1)row_id:用于特殊情况下构建聚簇索引;2)trx_id:事务id,表示对该记录进行更新的最近事务ID;3)roll_pointer:回滚指针,用于将记录回滚到指定历史版本;
  • 记录的历史版本通过Undo Log构建,多个事务对于同一记录的修改会以Undo Log的形式保存下来,且这些log会以链表形式(通过记录中的回滚指针连接)存在,如:
    在这里插入图片描述
  • 事务开启之时,会对当前数据库系统生成一个快照,该快照就是Read View,其中维护如:1)产生该Read View的事务ID;2)产生当前Read View时,系统中的活跃事务ID;等信息;
  • Read View的主要作用是在记录对应版本链中确认哪些版本对于当前事务是可见的;
  • 注意MVCC用于解决读-写冲突,只对应于读已提交和可重复读两种隔离级别,因此Read View的具体生成与隔离级别有关:
    1)隔离级别为读已提交时,可解决脏读问题,所以对于每一次的SELECT查询均会生成对应的Read View;
    2)隔离级别为可重复读时,可解决脏读、不可重复读以及幻读问题,所以对于某事务中的多次SELECT查询只会在第一次时生成对应的Read View;

3.1 Read View中含有什么内容

  • creator_trx_id :创建这个 Read View 的事务 ID(只有在对表中的记录做改动时(执行INSERT、DELETE、UPDATE这些语句时)才会为事务分配事务id,否则在一个只读事务中的事务id值都默认为0);
  • trx_ids :表示在生成ReadView时当前系统中活跃的读写事务的事务id列表 ;
  • up_limit_id :活跃的事务中最小的事务 ID;
  • low_limit_id:表示生成ReadView时系统中应该分配给下一个事务的 id 值,low_limit_id 是系
    统最大的事务id值

3.2 ReadView的规则

访问某条记录时,通过ReadView,只需要按照下边的步骤判断记录的某个版本是否可见:

  • 如果被访问版本的trx_id属性值与ReadView中的 creator_trx_id相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问;
  • 如果被访问版本的trx_id属性值小于ReadView中的 up_limit_id 值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问;
  • 如果被访问版本的trx_id属性值大于或等于ReadView中的 low_limit_id 值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本不可以被当前事务访问;
  • 如果被访问版本的trx_id属性值在ReadView的 up_limit_idlow_limit_id 之间,那就需要判断一下trx_id属性值是不是在 trx_ids 列表中:
    1)如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问;
    2)如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问;

4. MVCC整体操作流程

当查询一条记录的时候,系统使用MVCC根据如下步骤进行读取:

  1. 首先获取事务自己的版本号,也就是事务 ID;
  2. 获取 ReadView;
  3. 查询得到的数据,然后与 ReadView 中的事务版本号进行比较;
  4. 如果不符合 ReadView 规则,就需要从 Undo Log 中获取历史快照;
  5. 最后返回符合规则的数据,如果没有找到符合规则的版本,则表示记录不存在;

参考《尚硅谷:康师傅》

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

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

相关文章

【数学建模】——相关系数

第一部分:皮尔逊相关系数的计算以及数据的描述性统计 本讲我们将介绍两种最为常见的相关系数:皮尔逊person相关系数和斯皮尔曼spearman等级相关系数。它们可以用来衡量两个变量之间的相关性的大小,根据数组满足的不同条件,我们要选…

linux图形界面总结——X、Xorg、WM、QT、GTK、KDE、GNOME的区别与联系

文章目录 一、 linux图形界面二、X协议三、Xfree86 Xorg四、WM(window manager:窗口管理器)五、X协议的Client端实现六、KDE、GNOME、QT和GTK直接关系七、参考: 一、 linux图形界面 linux本身没有图形界面,linux现在的图形界面的实现只是linux下的应用程…

网络类型及数据链路层协议

目录 网络类型的分类 数据链路层协议 MA网络以太网协议 P2P网络 HDLC ---高级数据链路控制协议 更改链路协议的方法 HDLC数据帧封装结构 PPP---点到点协议 PPP协议的优点 PPP数据帧封装结构 PPP会话的搭建 链路建立阶段---LCP建立 认证阶段 网络层协议协商阶段--- NCP协商 网络…

大型风电叶片研发项目管理体系建设实践︱中车时代新材PMO负责人姚运帅

中车株洲时代新材料科技股份有限公司风电运维事业部总经理、PMO负责人姚运帅先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:大型风电叶片研发项目管理体系建设实践。大会将于8月12-13日在北京举办,敬请关注&#xff01…

sqlserver 存储过程当中如何实现增删改查

--声明存储过程 新增编辑 ALTER procedure [dbo].[Eng_MyAddOrEdtADPro] My_Cocode int, Type int, -- --1 新增 2 编辑 My_KeyId uniqueidentifier, My_PCode int, My_SCode int, My_PName nvarchar(36), My_SName nvarchar(36), My_Orde…

IPUU的小工具拍了拍你(下)

IPUU是埃文科技旗下的综合性IP查询网站,提供多维度的IP数据信息。通过在线查询,用户可以获取目标IP地址的详尽信息,包括位置属性、网络属性、风险属性以及业务属性等,同时还可以查询域名信息。无论您是需要查看某个IP地址归属地&a…

1.13 通过aop日志监控service执行时间

步骤1&#xff1a;添加aop依赖包 <!-- aop切面 依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>步骤2&#xff1a;创建AOP日记监控记录切面类 …

微服务架构——配置中心

「配置中心」&#xff0c;顾名思义&#xff0c;就是用来统一管理项目中所有配置的系统。虽然听起来很简单&#xff0c;但也不要小瞧了这个模块。如果一个中型互联网项目&#xff0c;不采用配置中心的模式&#xff0c;一大堆的各类配置项&#xff0c;各种不定时的修改需求&#…

TMS Aurelius v5.15 Source Crack

TMS Aurelius v5.15 Source Crack 面向Delphi的ORM框架&#xff0c;完全支持数据操作、复杂和高级查询、继承、多态等。。。 功能详细信息 支持多个数据库服务器(MS SQL Server、Firebird、MySQL、DB2、Interbase、Oracle等) 支持多个数据库访问组件(dbExpress、AnyDac、SQLDir…

Linux驱动开发:设备树dts详解

前言&#xff1a;掌握设备树是 Linux 驱动开发人员必备的技能&#xff01;因为在新版本的 Linux 中&#xff0c;ARM 相关的驱动全部采用了设备树(也有支持老式驱动的&#xff0c;比较少)&#xff0c;最新出的 CPU 其驱动开发也基本都是基于设备树的&#xff0c;比如 ST 新出的 …

Stable Diffusion + EbSynth + ControlNet 解决生成视频闪烁

一、安装 1.1、安装ffmpeg 下载地址&#xff1a; 解压&#xff0c;配置环境变量 E:\AI\ffmpeg\bin 检查是否安装成功 1.2、安装SD的 EbSynth 插件 插件地址 https://github.com/s9roll7/ebsynth_utility 报错&#xff1a;ModuleNotFoundError: No module named extension…

后端查询出的数据库数字自动补零和不补零

select CAST(YTD_CHANGE*100 as decimal(18,1)), round(YTD_CHANGE*100,1) from RP where data_date 20211231补零 round(PYTD_CHANGE_PER*100,1)不补零 CAST(PYTD_CHANGE_PER*100 as decimal(18,1))

day39-Oracle分区表

0目录 Oracle分区表 1.2.3 1. Oracle分区表 1.1 作用&#xff1a; Oracle数据库的分区把表中的数据行按照分区划成几个区域&#xff0c;提高大数据量下表的性能 1.2 应用场景&#xff1a;常应用于数据量大的表 1.3 分类&#xff1a;Oracle中有范围分区&#xff08;最常见…

LCD-STM32液晶显示中英文-(5.字符编码)

目录 字符编码 字符编码说明参考网站 字符编码 ASCII编码 ASCII编码介绍 ASCII编码表 中文编码 1. GB2312标准 区位码 2. GBK编码 3. GB18030 各个标准的对比说明 4. Big5编码 字符编码 字符编码说明参考网站 字符编码及转换测试&#xff1a;导航菜单 - 千千秀字 …

代码随想录day6 | 1. 两数之和 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

文章目录 1. 两数之和2. 四数相加II3. 赎金信4. 三数之和5. 四数之和 1. 两数之和 1. 两数之和 虽然是LeetCode第一题&#xff0c;但是还是挺难的&#xff01; 模拟一下&#xff1a; class Solution { public:vector<int> twoSum(vector<int> &nums, int ta…

解决appium-doctor报opencv4nodejs cannot be found

一、下载cmake 在CMake官网下载&#xff1a;cmake-3.6.1-win64-x64.msi 二、安装cmake cmake安装过程 在安装时要选择勾选为所有用户添加CMake环境变量 三、检查cmake安装 重新管理员打开dos系统cmd命令提示符&#xff0c;输入cmake -version cmake -version四、安装opencv4no…

美国某市政府出现重大数据泄露事件,疑似离职人员未删除权限

近日&#xff0c;美国得克萨斯州西部城市敖德萨市市长Javier Joven宣布&#xff0c;自2022年12月以来&#xff0c;已经有人多次使用前敖德萨市检察官Natasha Brooks的账户非法访问了该市的政府系统&#xff0c;并将大量敏感信息通过电子邮件转移到了一个私人账户&#xff0c;敖…

创建ReWorks自引导工程

自引导工程开发与集成流程 2、新建工程 3、资源配置 4、代码编写 5、构建项目 右键构件项目&#xff0c;或选择“构建按钮”构建项目 6、配置TFTP服务路径 右键IMX6Q_SMP文件夹&#xff0c;配置TFTP服务路径 或 7、打开串口终端 8、启动开发板 查看网卡 素材来源于&#xff1…

社区版、专业版、企业版、专有版,smardaten四个版本到底怎么选?

这是一篇新老用户都不容错过的文章&#xff01; 要问今年上半年smardaten最大的变化&#xff0c;轻量化版本的推出双手奉上~~ 这时每一个心痒痒的客户&#xff0c;几乎都要迷茫的问睿睿两个问题&#xff1a;“现有版本之间有什么区别&#xff1f;都怎么收费&#xff1f;”。 …

在Microsoft Excel中如何快速将上下两行数据合并为一行?

合并单元格是电子表格初学者最常用的选项之一。当一组单元格、行或列需要标题或标签时,合并单元格是一种常用的技术。 合并单元格时,仅保留区域左上角单元格中的值或公式,并将其显示在合并后的单元格中。将丢弃任何其他值或公式,那么如何在新的空白单元格中将两行数据合并…