首页 > 数据库 >【阅读笔记】MySQL的多版本并发控制(MVCC-Multiversion Concurrency Control)

【阅读笔记】MySQL的多版本并发控制(MVCC-Multiversion Concurrency Control)

时间:2024-04-07 11:48:29浏览次数:28  
标签:Control Multiversion 事务 记录 Undo 并发 MVCC 日志

摘自:高性能MySQL(第四版)

MVCC的作用

InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读的问题

MVCC的应用

MySQL的大多数事务型存储引擎使用的都不是简单的行级锁机制。

它们会将行级锁和可以提高并发性能的多版本并发控制(MVCC)技术结合使用。

不仅是MySQL,包括Oracle、PostgreSQL以及其他一些数据库系统也都使用了MVCC,但各自的实现机制不尽相同,因为MVCC如何工作没有统一的标准。

MVCC是什么?

可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。根据其实现方式,不仅实现了非阻塞的读操作,写操作也只锁定必要的行。

MVCC工作原理

MVCC的工作原理是使用数据在某个时间点的快照来实现的。这意味着,无论事务运行多长时间,都可以看到数据的一致视图,也意味着不同的事务可以在同一时间看到同一张表中的不同数据!如果你之前没有这方面的概念,这句话听起来可能有点让人迷惑,熟悉了以后你会发现还是很容易理解的。
每个存储引擎实现MVCC的方式都不同。其中一些变体包括乐观并发控制和悲观并发控制

下图是MVCC的一种实现方式的序列图

InnoDB实现MVCC的方式

InnoDB通过为每个事务在启动时分配一个事务ID来实现MVCC。

该ID在事务首次读取任何数据时分配。

在该事务中修改记录时,将向Undo日志写入一条说明如何恢复该更改的Undo记录,并且事务的回滚指针指向该Undo日志记录。

这就是事务如何在需要时执行回滚的方法。


当不同的会话读取聚簇主键索引记录时,InnoDB会将该记录的事务ID与该会话的读取视图进行比较。如果当前状态下的记录不应可见(更改它的事务尚未提交),那么Undo日志记录将被跟踪并应用,直到会话达到一个符合可见条件的事务ID。这个过程可以一直循环到完全删除这一行的Undo记录,然后向读取视图发出这一行不存在的信号。
事务中的记录可以通过在记录的“info flags”中设置“deleted”位来删除。这在Undo日志中也被作为“删除标记”进行跟踪。
值得注意的是,所有Undo日志写入也都会写入Redo日志,因为Undo日志写入是服务器崩溃恢复过程的一部分,并且是事务性的。

这些Redo日志和Undo日志的大小也是高并发事务工作机制中的重要影响因素。
在记录中保留这些额外信息带来的结果是,大多数读取查询都不再需要获取锁。

InnoDB实现MVCC的方式的优缺点

它们只是尽可能快地读取数据,确保仅查询符合条件的行即可。

缺点是存储引擎必须在每一行中存储更多的数据,在检查行时需要做更多的工作,并处理一些额外的内部操作。

MVCC的适用场景

MVCC仅适用于REPEATABLE READ和READ COMMITTED隔离级别。

READ UNCOMMITTED与MVCC不兼容,是因为查询不会读取适合其事务版本的行版本,而是不管怎样都读最新版本。

SERIALIZABLE与MVCC也不兼容,是因为读取会锁定它们返回的每一行。

标签:Control,Multiversion,事务,记录,Undo,并发,MVCC,日志
From: https://www.cnblogs.com/onejay/p/18118717

相关文章

  • MVCC(解决MySql中的并发事务的隔离性)
     MVCC如何保证事务的隔离性?1.排他锁:如一个事务获取了一个数据行的排他锁,其他事务就不能再获取改行的其他锁。2.MVCC:多版本并发控制。MVCC:1.隐藏字段1.DB_TRX_ID:最近修改事务的id。默认值从0开始,每次被修改自增1。也就是说每有一个事务修改了当前数据,这条数据的该字......
  • Replication Controller、ReplicaSet和Deployment(Kubernetes调度系列,结合操作命令讲解
    目录一、概述二、ReplicationController2.1ReplicationController说明2.2ReplicationController举例三、ReplicaSet3.1ReplicaSet说明3.2ReplicaSet举例四、无状态应用管理Deployment4.1概述4.2创建Deployment4.2.1Deployment标签内容解析4.2.2ku......
  • 【MATLAB 仿真】Model Predictive Control (1)、简单建模 【新加坡南洋理工大学 Nanyang
    一、1个简单的连续时间模型ASimpleContinuous-timeModel:1个简单的连续时间系统,使用状态空间模型进行表示:和标准型进行对比,得到模型参数二、MATLAB仿真代码MatlabSimulationCode:Ac=[010;301;010];Bc=[1;1;3];Cc=[010];Dc=zeros(1,1);......
  • @ControllerAdvice 的介绍及三种用法
    浅析@ControllerAdvice首先,ControllerAdvice本质上是一个Component,因此也会被当成组建扫描,一视同仁,扫扫扫。 然后,我们来看一下此类的注释:这个类是为那些声明了(@ExceptionHandler、@InitBinder或@ModelAttribute注解修饰的)方法的类而提供的专业化的@Component,以供多个C......
  • Win11系统提示找不到AppVEntSubsystemController.dll
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个AppVEntSubsystemController.dll文件(挑选合......
  • 后端开发基础概念 Entity,DO,DTO,DAO,VO, Service,Controller
    Entity主要用于ORM(对象关系映射)框架中,如Hibernate、MyBatis等,以便将数据库中的数据映射为对象,方便进行业务操作。Entity通常与数据库表一一对应,代表业务数据的基本单元。通常放在项目的model或entity包下。DO(DataObject)是一个更广泛的概念,它指的是用于在应用程序中传输数据......
  • IfcControllerTypeEnum
    IfcControllerTypeEnum类型定义IfcControllerTypeEnum定义了可以指定的不同类型控制器的范围。IFC2.0中的新枚举。IFC4 PROPORTIONALINTEGRAL和PROPORTIONALINTEGRALDERIVATIVE值已删除(现在使用属性集枚举)。添加了MULTIPOSITION。 EnumerationdefinitionConstantDescri......
  • 为什么 InputComponent->BindAxis(TEXT("ViewHorizontalOffSet"),this,&AMarioControl
    在UnrealEngine中,InputComponent->BindAxis和事件绑定(如OnComponentBeginOverlap)使用不同的系统和要求。这些差异导致了在绑定函数时对UFUNCTION()宏的不同需求。BindAxis和UFUNCTION()宏BindAxis:用于绑定输入轴(如游戏手柄的移动或旋转)。当绑定轴输入时,BindAxis函数直接引用......
  • 记录一次解决跨域问题解决过程。 strict-origin-when-cross-origin,net::ERR_FAILED, No
    事情是这样的,vue项目本地启动可以正常连接后端端口访问,部署到nginx上只有就无法访问,显示跨域问题  于是查看后端日志 啥都没有,觉得肯定是nginx的问题,怎么配置都没用, location/{ roothtml; indexindex.htmlindex.htm; add_header'Access-Control-Allow-O......
  • 在stable diffusion中如何分辨lora、大模型、controlnet
     LoRA(LowRankAdaptation)StableDiffusionLoRA是微软的研究人员为了解决大语言模型微调而开发的一项技术,它是一个多模态语言-图像模型,LORA可以学习将其语言表征迁移到图像modal中从而获得跨模态语义一致的表示。LoRA模型是Stable-Diffusion中的一个插件,仅需要少......