首页 > 其他分享 >MVCC 实现原理?

MVCC 实现原理?

时间:2023-06-20 13:22:42浏览次数:31  
标签:事务 实现 id read 版本 MVCC 原理 ID view

MVCC 实现原理?

MVCC(Multiversion concurrency control) 就是同一份数据保留多版本的一种方式,进而实现并发控制。在查询的时候,通过read view和版本链找到对应版本的数据。

作用:提升并发性能。对于高并发场景,MVCC比行级锁开销更小。

MVCC 实现原理如下:

MVCC 的实现依赖于版本链,版本链是通过表的三个隐藏字段实现。

  • DB_TRX_ID:当前事务id,通过事务id的大小判断事务的时间顺序。
  • DB_ROLL_PTR:回滚指针,指向当前行记录的上一个版本,通过这个指针将数据的多个版本连接在一起构成undo log版本链。
  • DB_ROW_ID:主键,如果数据表没有主键,InnoDB会自动生成主键。

每条表记录大概是这样的:

 

使用事务更新行记录的时候,就会生成版本链,执行过程如下:

  1. 用排他锁锁住该行;
  2. 将该行原本的值拷贝到undo log,作为旧版本用于回滚;
  3. 修改当前行的值,生成一个新版本,更新事务id,使回滚指针指向旧版本的记录,这样就形成一条版本链。

下面举个例子方便大家理解。

1、初始数据如下,其中DB_ROW_IDDB_ROLL_PTR为空。

 2、事务A对该行数据做了修改,将age修改为12,效果如下:

 3、之后事务B也对该行记录做了修改,将age修改为8,效果如下:

 4、此时undo log有两行记录,并且通过回滚指针连在一起。

接下来了解下read view的概念。

read view可以理解成将数据在每个时刻的状态拍成“照片”记录下来。在获取某时刻t的数据时,到t时间点拍的“照片”上取数据。

read view内部维护一个活跃事务链表,表示生成read view的时候还在活跃的事务。这个链表包含在创建read view之前还未提交的事务,不包含创建read view之后提交的事务。

不同隔离级别创建read view的时机不同。

  • read committed:每次执行select都会创建新的read_view,保证能读取到其他事务已经提交的修改。

  • repeatable read:在一个事务范围内,第一次select时更新这个read_view,以后不会再更新,后续所有的select都是复用之前的read_view。这样可以保证事务范围内每次读取的内容都一样,即可重复读。

read view的记录筛选方式

前提DATA_TRX_ID 表示每个数据行的最新的事务ID;up_limit_id表示当前快照中的最先开始的事务;low_limit_id表示当前快照中的最慢开始的事务,即最后一个事务。

 

  • 如果DATA_TRX_ID < up_limit_id:说明在创建read view时,修改该数据行的事务已提交,该版本的记录可被当前事务读取到。
  • 如果DATA_TRX_ID >= low_limit_id:说明当前版本的记录的事务是在创建read view之后生成的,该版本的数据行不可以被当前事务访问。此时需要通过版本链找到上一个版本,然后重新判断该版本的记录对当前事务的可见性。
  • 如果up_limit_id <= DATA_TRX_ID < low_limit_i
    1. 需要在活跃事务链表中查找是否存在ID为DATA_TRX_ID的值的事务。
    2. 如果存在,因为在活跃事务链表中的事务是未提交的,所以该记录是不可见的。此时需要通过版本链找到上一个版本,然后重新判断该版本的可见性。
    3. 如果不存在,说明事务trx_id 已经提交了,这行记录是可见的。

总结:InnoDB 的MVCC是通过 read view 和版本链实现的,版本链保存有历史版本记录,通过read view 判断当前版本的数据是否可见,如果不可见,再从版本链中找到上一个版本,继续进行判断,直到找到一个可见的版本。

标签:事务,实现,id,read,版本,MVCC,原理,ID,view
From: https://www.cnblogs.com/kisshappyboy/p/17493383.html

相关文章

  • Docker配置SpringBoot+ShardingJDBC+MybatisPlus项目实现分库分表与读写分离
    Docker配置SpringBoot+ShardingJDBC+MybatisPlus项目实现分库分表与读写分离 分类于 实战例子本文ShardingJDBC相关知识主要参考自ShardingJDBC官方文档,更多的用法建议到官网文档查看。前言传统的业务系统都是将数据集中存储至单一数据节点的解决方案,如今随着互联网数据......
  • Web项目中使用Spring 3.x + Quartz 2.x实现作业调度详解
    Quartz是一个基于Java的作业调度管理的轻量级框架,目前在很多企业应用中被使用,它的作用类似于java.util中的Timer和TimeTask、数据库中的job等,但Quartz的功能更强大、更灵活。从Quartz2开始,你可以使用POJO作为一个任务(Job),这种开发方式进一步降低了代码的耦合度,如果跟Spring进行整合,......
  • 基于fpga的直方图均衡 fpga图像处理 fpga开发实现一张rgb565分辨率300*200的图像的
    基于fpga的直方图均衡fpga图像处理fpga开发实现一张rgb565分辨率300*200的图像的直方图均衡化,主图为均衡后图像,副图为原图,由于原图像的对比度非常低,所以显示地并不清楚,也可以看出,经过处理后的图像对比度显著提高,使得图像清晰。基于FPGA的直方图均衡是一种使用FPGA进行图像处理......
  • 51单片机的发酵温度控制系统 仿真,程序,dxp原理图pcb均有 "
    51单片机的发酵温度控制系统仿真,程序,dxp原理图pcb均有"我正在开发一个基于51单片机的发酵温度控制系统,并已完成仿真、程序编写以及dxp原理图pcb设计。"涉及的知识点和领域范围:51单片机:51单片机是一种常用的微控制器,广泛应用于嵌入式系统和电子设备中。它具有低功耗、高性能和丰富......
  • 太阳能自动灌溉系统 利用spwm实现逆变正弦波,仿真,程序,dxp原理图
    太阳能自动灌溉系统利用spwm实现逆变正弦波,仿真,程序,dxp原理图太阳能自动灌溉系统利用SPWM技术实现逆变正弦波,通过仿真和编程来实现系统控制,同时使用DXP原理图进行电路设计。知识点和领域范围:1.太阳能自动灌溉系统:这是一个利用太阳能作为能源的自动灌溉系统,可以根据土壤湿度或其......
  • 51单片机的智能电子秤仿真,程序,dxp原理图pcb均有 涉及到的知识
    51单片机的智能电子秤仿真,程序,dxp原理图pcb均有涉及到的知识点和领域范围主要是嵌入式系统开发和电子称技术。嵌入式系统是一种特殊的计算机系统,通常用于控制和执行特定任务。51单片机是一种常用的嵌入式系统芯片,广泛应用于各种电子设备中。智能电子秤是一种利用传感器和嵌入式系......
  • [6月摸鱼计划] 微机原理的一些精要概念
    微机原理是指微型计算机的基本原理和工作原理。以下是微机原理的一些精要概念: 1.中央处理器(CPU):微型计算机的核心部件,负责执行指令和控制计算机的运行。存储器:用于存储数据和指令的设备,包括主存储器(RAM)和辅助存储器(硬盘、固态硬盘等)。输入设备:用于将外部数据输入到计算机中的设备......
  • Dtu 解决方案 源代码GPRS DTU方案 包括项目所有代码、原理图、PCB
    Dtu解决方案源代码GPRSDTU方案包括项目所有代码、原理图、PCB文件。本项目经历过4个月的测试,bug总量在一个非常低的水平。方案包括以下部分:Dtu硬件代码:(MCU:STM32F103C8T6?模块:移远m26)Dtu上位机代码:(环境C++和VB)Dtu配置软件代码:(环境C++和VB)Dtu生产测试软件代码:(环境C++和VB)DTU生......
  • 【数据库原理、编程与性能】Integrity, View, Security
    文章目录1.IntegrityConstrains1.1Definition1.2实施机制1.3IntegrityConstraintsinCreateTableStatement1.3.1CreateTable1.3.2ColumnConstraints1.3.3TableConstraints.1.4AlterTableStatement1.5Trigger1.5.1CreateTriggerStatement1.5.2DropTrigger......
  • 【数据库原理、编程与性能】Indexing
    文章目录1.ConceptofIndexing1.1Index1.2CreateIndex1.3DB-Index分类1.4建立索引的原则:1.5DB-Index作用2.聚簇(Cluster/ClusterIndex)存取方法2.1概念2.2特点2.3弊端1.ConceptofIndexing1.1Index索引项=索引键+行指针索引是对数据库表中一列或多列的值进行排......