首页 > 其他分享 >【面试题】MVCC多版本并发控制

【面试题】MVCC多版本并发控制

时间:2024-07-17 22:01:03浏览次数:20  
标签:面试题 快照 trx 记录 事务 并发 版本 MVCC id

多版本并发控制指的就是维护一个数据的多个版本,,是得读写操作没有冲突;MVCC锁(排他锁)也是事务隔离性的保证

就好比以下的例子,我们查询id为30的记录到底是查询的是哪个事务所有修改的数据呢?这个就是MVCC的特点了,MVCC可保证我们读写操作没有冲突

MVCC的具体实现,主要是依赖于数据库记录中的隐式字段、undo log日志、readView。下面就来介绍一下这几个组成作用都是什么

隐式字段

隐藏字段是指:在mysql中给每个表都设置了隐藏字段其中包括以下三种:

  • DB_Trx_Id:最近修改事务的ID,记录插入这条记录或最后一次修改记录的事务ID
  • DB_Roll_Ptr:回滚指针,只想这条记录的上一个版本,用于配合undo log,指向上一个版本
  • DB_Row_Id:隐藏主键,如果表结构没有指定主键,那么将会自动生成一个隐藏字段

Undo Log

回滚日志,在insert、update、delete的时候产生一个与之相反的sql(如insert的命令则在日志中加一个delete语句),便于数据回滚的日志

当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除

而update、delete的时候,产生的undo log日志不仅在回滚时需要,MVCC版本访问也需要,不会立即被删除

Undo log版本链

undo 日志版本链是指一行数据被多个事务依次修改过后,MySQL 会为每个事务保留修改前的数据 undo 回滚日志,并通过两个隐藏字段trx_id(表示更新本行数据的事务 id)和roll_pointer(表示回滚指针,它指向该行数据上一个版本的 undo 日志)将这些 undo 日志串联起来形成的一个历史记录版本链

以下就是上述例子中的undo log版本链:

 不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录

ReadView

ReadView(读视图)是快照读Sql执行时MVCC提取提取数据的依据,记录并且维护当前活跃的事务(未提交的)id

当前读:读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如select ... lock in share mode(共享锁),select ... for update、update、insert、delete(排他锁)都是一种当前读

 快照读:简单的select(不加锁)就是快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读,在不同的隔离级别之下,生成快照读的时机是不同的

  • Read Committed:每次select都会生成一个快照读
  • Repeatable Read:开启事务后第一个select语句才是快照读的地方,后序会复用该快照读

在ReadView中包含四个核心字段:

字段含义
m_ids当前活跃的事务ID集合
min_trx_id最小活跃事务ID
max_trx_id预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)
creator_trx_idReadView创建者的事务ID

以下是关于MVCC版本链数据访问规则:

  • trx_id == creator_trx_id 可以访问该版本
    成立,说明数据是当前这个事务更改的。

  • trx_id < min_trx_id 可以访问该版本
    成立,说明数据已经提交了。

  • trx_id > max_trx_id 不可以访问该版本
    成立,说明该事务是在ReadView生成后才开启。

  • min_trx_id <= trx_id <= max_trx_id 如果trx_id不在m_ids中是可以访问该版本
    成立,说明数据已经提交。

下面会以下述的事务执行顺序表来进行说明不同隔离级别的快照读

在RC的隔离级别下,每次select都会生成一个快照读,生成的快照如下:

根据版本链访问规则可知,第一次生成的快照读访问的是事务2,第二次生成的快照读访问的是事务3: 

由此可知在RC级别下,可知每次快照读都是访问已经提交的事务

在RR的隔离级别下,只有事务第一次执行的时候会生成一个快照读,生成的快照如下:

 可知两次select读取的都是事务2

总结

其中mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,它的底层实现主要是分为了三个部分,第一个是隐藏字段, 第二个是undo log日志,第三个是readView读视图

隐藏字段是指:在mysql中给每个表都设置了隐藏字段,有一个是trx_id(事 务id),记录每一次操作的事务id,是自增的;另一个字段是roll_pointer(回 滚指针),指向上一个版本的事务版本记录地址

undo log主要的作用是记录回滚日志,存储老版本数据,在内部会形成一个版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本, 通过roll_pointer指针形成一个链表

readView解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规 则和当前的一些事务id判断该访问那个版本的数据,不同的隔离级别快照读 是不一样的,最终的访问的结果不一样。如果是rc隔离级别,每一次执行快 照读时生成ReadView,如果是rr隔离级别仅在事务中第一次执行快照读时生 成ReadView,后续复用

标签:面试题,快照,trx,记录,事务,并发,版本,MVCC,id
From: https://blog.csdn.net/loss_rose777/article/details/140503092

相关文章

  • 甲骨文面试题【动态规划】力扣377.组合总和IV
    给你一个由不同整数组成的数组nums,和一个目标整数target。请你从nums中找出并返回总和为target的元素组合的个数。题目数据保证答案符合32位整数范围。示例1:输入:nums=[1,2,3],target=4输出:7解释:所有可能的组合为:(1,1,1,1)(1,1,2)(1,2,1)......
  • 如何生成好看的zabbix告警报表并发送邮件
    作者乐维社区(forum.lwops.cn) 许远一、场景模拟小东是一名资深的IT运维人员,其直属领导想要了解公司业务系统的健康状态以及小东日常的工作情况等,要求小东每周统计系统告警情况并发邮件给到他。小东所在公司搭建了一套zabbix开源监控,于是小东利用自己的专业知识,实现了zabbix告......
  • 数据类型及扩展面试题
    publicclassdemo3{publicstaticvoidmain(String[]args){整数拓展进制二进制(0b)八进制(0)十进制十六进制(ox)inti=10;inti1=010;//八进制inti2=0xC;//十六进制0~9A~FSystem.out.println(i);System.out.println(i1);System.out.......
  • Java开发手册中-锁并发-同步调用应该去考量锁的性能损耗-加锁与不加锁性能对比
    场景Java中使用JMH(JavaMicrobenchmarkHarness微基准测试框架)进行性能测试和优化:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131723751参考以上性能测试工具的使用。Java中数据同步-synchronized关键字与Mointor(jconsole)的使用:https://blog.csdn.net/......
  • 前端—面试题1
    前端—今日面试题var、let和const的区别var的特点let的特点const的特点var、let和const的区别简介:能用const的情况下尽量使用const,大多数情况使用let,避免使用var技巧:const一般声明引用数据类型,let一般声明基本数据类型区别:varletconst变量提升√块级作用域√√......
  • 并发工具类
    文章目录一、Semaphore1.1作用1.2Semaphore的原理二、CountDownLatch2.1作用2.2CountDownLatch的原理2.3使用场景三、CyclicBarrier3.1作用3.2CyclicBarrier的原理Java的并发工具类提供了一系列方便实用的方法,用于简化多线程编程。以下是一些常见的并发......
  • 前端面试题
    1.v-model是什么?怎么使用?vue中标签怎么绑定事件?一、v-model就是vue的双向绑定的指令,能将页面上控件输入的值同步更新到相关绑定的data属性,也会在更新data绑定属性时候,更新页面上输入控件的值。用于表单数据的双向绑定,其实它就是一个语法糖二、v-model本质上不过是语法糖可以......
  • Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点在Kotlin中,匿名函数和lambda表达式都是用于表示函数类型的匿名函数(即没有名字的函数)。虽然它们在某些情况下可以互换使用,但是它们在语法和使用场景上存在一些细微的......
  • 大模型算法面试题(三)
    本系列收纳各种大模型面试题及答案。1、如何评估大模型的效果及安全性一、评估大模型的效果评估大模型的效果主要关注其在特定任务上的表现能力,这通常可以通过以下几个维度来衡量:语言理解能力:语义、语法、语境:评估模型是否能够准确理解输入文本的含义、语法结构以及上......
  • JVM高频面试题
    1.内存模型线程独享:虚拟机栈,本地方法栈,程序计数器线程共享:堆,方法区2.虚拟机栈的作用存放栈帧,栈帧又包含局部变量表,每个方法从被调用到执行结束的过程都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程3.程序计数器存放下一条指令的信息4.堆Java堆......