Mysql MVVC笔记

article/2025/6/15 13:26:08

什么是MVVC,为什么要用它

在mysql的InnoDB不同事务隔离级别中,MVVC(Multi-Version Concurrency Control)工作在RC(Read Commited)和RR(Repeatable Read)这两种隔离级别中。其实MVVC简单理解,就是通过对每个事务赋予一个唯一的、递增的id来代替对数据行上锁从而减小DBMS的开销,也就是读不会加锁。
举个不是很准确的例子,有两个事务T1,T2,它们的id分别是1,2。由于事务id是递增唯一的,因此可以认为T2在逻辑上是后于T1发生的,当T2想要查询(select)某一行,这行的trx_id(最后修改本行数据的事务id)为1,那么我们就可以认为这一行对T2是可见的,因此返回改行数据。
其实这个例子问题很大,这也是为什么要写这篇文章记录一下

前置知识

在InnoDB中,每个行后面都有一些额外的字段,主要要知道DB_TRX_ID(最近修改行的事务ID),DB_ROLL_PTR(指向该行被修改的前一个状态),DELETE_VERSION(行是否被删除)。

当某个事务T对一行R做update操作时,若R对T是可见的(判断方法放在后面讲),将该行的DELETE_VERSION置为T的id,并将改行放入undo log中,而在表中会插入一条新的行R’,R’的DB_TRX_ID为T的id,DELETE_VERSION为空,DB_ROLL_PTR指向刚刚被打入undo log的那行

修改前↓修改前
修改后↓
在这里插入图片描述

READ VIEW

其实ReadView可以理解成数据库中某个时间戳所有未提交事务的快照,ReadView类有这么几个参数:

  • m_ids:当前时间戳所有未提交的事务
  • min_trx_id:m_idx中最小的事务id
  • max_trx_id:当前时间戳InnoDB将在下一次分配的事务id
  • creator_trx_id:当前事务id

当创建一个ReadView对象时,也就知道了这个时间点上未提交事务的所有信息,从而能够通过这些信息实现锁的作用甚至增强。

有了这个ReadView,这样在访问某条记录时,只需要按照下边的步骤判断记录的某个版本是否可见:
如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。
如果被访问版本的trx_id属性值小于ReadView中的min_trx_id值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问。
如果被访问版本的trx_id属性值大于或等于ReadView中的max_trx_id值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本不可以被当前事务访问。
如果被访问版本的trx_id属性值在ReadView的min_trx_id和max_trx_id之间,那就需要判断一下trx_id属性值是不是在m_ids列表中,如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问;如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问。

正题

假如现在DBMS在处理三个事务,T2,T3,T5(T4已经提交了),那么开启下一个事务的时候,将会分配到一个id为6的id,也就是T6。现在T6要select这样一行:

首先会创建一个ReadView对象r:
r.m_ids=[T2,T3,T5],
r.min_trx_id=2,
r.max_trx_id=7
由于该行DB_TRX_ID=2, 而2!<r.min_trx_id,并且T2 in m_ids,因此可以判断出创建快照的时候T2还未提交(当然其实在做这个判断的时间戳上T2也许已经提交了,不过这种CPU调度的事是无法预料的),因此认为这一行对T6是不可见的。

如果该行是这样子的:
由于1<r.min_trx_id=2,因此最后修改该行的事务必然已经提交,所以该行对T6可见。

又如果是:
在这里插入图片描述
那就最后的改动就是在T6中进行的,也是对T6可见。

亦或是这里是引用
CPU调度嘛,人家虽然后来的但也可能先你下手了 。因此由于8>=r.max_trx_id=7,所以该行对T6不可见,找一下DB_ROLL_PTR指向的行,由于是空,返回0行。(如果不为空,那么对所指向的行对同样的可见性判断)

再者:
在这里插入图片描述
虽然r.min_trx.id<=4<r.max_trx_id,但是由于T4 not in m_ids,可知T4已提交,因此该行对T6是可见的。

总结一下就是如下一个流程图:
在这里插入图片描述
copy的,tmin,tmax,tid0分别对应r.min_trx.id,r.max_trx_id,DB_TRX_ID。

回到开头
有些博客写的是
在这里插入图片描述
如果以小于或等于当前事务版本号为依据来判断行的可见性,那么就会漏掉依然活跃未提交的事务,在RR隔离级别下会产生不可重复度(离谱)。

RR和RC的区别

  • READ COMMITTED —— 每次读取数据前都生成一个ReadView
  • REPEATABLE READ —— 在第一次读取数据时生成一个ReadView

Featrue plus

其实在这样的MVVC下,InnoDB在RR隔离级别下就能避免了幻读,原因是不管是后面新的事务还是已经存在的未提交事务,他们新增的数据行对当前事务都是不可见的,而已提交的事务又不可能新增行,妙啊

参考博客:
MVCC ReadView介绍


http://chatgpt.dhexx.cn/article/J1VS4a8k.shtml

相关文章

MVC和MVVC的一些区别

前言 一、MVC 定义&#xff1a;Model&#xff08;模型&#xff09;-View&#xff08;视图&#xff09;-Controller&#xff08;控制器&#xff09;&#xff0c;是一种将业务逻辑、数据、界面显示分离开来的软件设计模式&#xff0c;更偏向于后端。 目的&#xff1a;将模型和和…

js判断两个字符串是否相等的办法

js判断两个字符串是否相等的两种方法 1、使用比较运算符判断两个字符串是否相等 可以使用比较运算符 或 来判断两个字符串是否相等。例如&#xff1a; 1 2 3 4 5 6 7 const str1 apple const str2 apple if (str1 str2) { console.log(两个字符串相等) } else { con…

java string 不相等_java判断字符串是否不相等的方法

1、判断地址是否相等 用&#xff1a; Object类作为所有类的超类&#xff0c;而Object类的equals方法是直接比较地址的&#xff0c;源码如下&#xff1a;public boolean equals(Object obj) { return this obj; } 2、判断值是否相等 用&#xff1a;equals方法 equals() 方法用于…

java if判断是否相等_java使用if语句判断字符串是否相等的方法

java使用if语句判断字符串是否相等的方法 发布时间&#xff1a;2020-06-23 19:48:51 来源&#xff1a;亿速云 阅读&#xff1a;133 作者&#xff1a;Leah 本篇文章展示了java使用if语句判断字符串是否相等的方法&#xff0c;代码简明扼要容易理解&#xff0c;绝对能让你眼前一亮…

MySQL 中判断字符串是否相等

感谢&#xff1a; https://blog.csdn.net/yangfengjueqi/article/details/72821603 mysql 中判断两个字符串是否相等可以用 <>或者 例 但是需要注意<>&#xff0c;和 是有区别的 当判断是都为空的时候&#xff0c;有如下结果 是因为 null值是没有意义的&#x…

html页面判断是否相等,javascript如何判断字符串是否相等

有时候我们在编写JavaScript代码的时候&#xff0c;需要判断两个字符串是否相等&#xff0c;这样怎么操作&#xff1f;下面本篇文章就来给大家介绍一下&#xff0c;希望对大家有所帮助。 在javascript中判断字符串是否相等&#xff0c;一般使用相等运算符“”或者“”进行比较判…

equals判断字符串是否相等

在Java中判断两个字符串是否相等&#xff0c;需要使用equals方法&#xff1b; 语法&#xff1a;字符串1.equals(字符串2) 如果字符串1等于字符串2返回true&#xff0c;否则返回false&#xff1b; 输出&#xff1a; str与str1是否相等true例题 在数组中查找指定字符串位置 …

java使用==和equals()判断字符串是否相等

equals()方法&#xff1a; equals()方法用于将字符串与指定的对象比较。String类中重写了equals()方法用于比较两个字符串的内容是否相等。 语法&#xff1a; //object:与字符串进行比较的对象 public boolean equals(Object anObject)返回值&#xff1a; 如果给定对象与字…

html页面判断是否相等,javascript怎么判断字符串是否相等?

在javascript中可以对字符串进行各种操作&#xff0c;下面本篇文章就来给大家介绍如何使用javascript对字符串进行相等判断&#xff0c;希望对大家有所帮助。 在javascript中判断字符串是否相等&#xff0c;一般使用相等运算符“”或者“”进行比较判断。 1、使用“”进行比较 …

java字符串判断相等_java判断字符串是否相等的方法

java判断字符串是否相等的方法&#xff1a; 1、java中字符串的比较&#xff1a; 我们经常习惯性的写上if(str1str2)&#xff0c;这种写法在java中可能会带来问题 example1:String a"abc"; String b"abc" 那么ab将返回true。因为在java中字符串的值是不可改…

JAVA中判断两个字符串是否相等

Java中判断字符串是否相等 相等判断操作符 Java中&#xff0c; 相等判断符用于判断基本数据类型和引用数据类型。当判断基本数据类型时&#xff0c;判断的是数值&#xff0c;当判断引用数据类型时&#xff0c;判断变量是否指向同一引用对象。 使用 判断字符串时&#xff0c…

检测字符串是否相等

1、可以使用equals方法检测两个字符串是否相等 2、也可以使用compareTo方法进行比较 当比较两个字符串是否相等而不区分大小写时&#xff0c;也可以使用 equalsIgnoreCase compareToIgnoreCase 这两个进行判断 public static void main(String[] args) {String a "a…

Vue计算属性Computed传参

关于computed计算属性传参的问题&#xff0c;因为computed是计算属性&#xff0c;如果给conputed传参则会直接报错&#xff0c;并且报computed is not function。 解决办法&#xff1a; 方法一&#xff1a; 通过返回函数来进行传参&#xff1a; 代码&#xff1a; computed:{ …

vue计算属性与监视属性

计算属性与监视属性 计算属性 在computed对象中定义计算属性的方法&#xff0c;在页面中使用{{方法名}} 监视属性 通过 vm对象中的$watch方法或者 watch配置来监视指定的属性&#xff0c; 当属性发生变化时&#xff0c;回调函数自动调用&#xff0c;在函数内部进行计算 使用v…

vue 计算属性

计算属性&#xff1a; 1、定义&#xff1a;要用的属性不存在&#xff0c;要通过已有属性计算得来。 2、原理&#xff1a;底层借助了object.defineproperty方法提供的getter和setter。 3、get函数什么时候执行&#xff1f; &#xff08;1&#xff09;初次读取时会执行一次。 &am…

【vue】计算属性

vue官网对于计算属性的描述&#xff1a; 模板内的表达式非常便利&#xff0c;但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。 当你想要在模板中的多处包含此翻转字符串时&#xff0c;就会更加难以处理。所以&#xff0c;对于任何复杂逻辑…

Vue计算属性实现成绩单,Vue计算属性

Vue计算属性实现成绩单 代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>成绩单统计</title><script src"js/vue.js" type"text/javascript" charset"utf-8"…

Vue-计算属性

一、计算属性的使用 【什么是计算属性】 ——写在computed对象中的属性&#xff0c;本质上是一个方法&#xff0c;不过使用时依旧当属性来使用&#xff01; 1.计算属性&#xff1a;首先它是一个属性&#xff0c;所以使用方式跟其他的属性没什么&#xff0c;就是定义的时候不同…

Vue的计算属性

一、姓名案例 1、姓名案例 效果&#xff1a;两个输入框&#xff1a;姓名 两个输入框改变 全名也会跟着改变 实现联动效果2、插值语法实现姓名案例 1、简单实现 2、增加需求 只收集姓 的输入框里面前三位&#xff0c;后面不再录入 3、再次优化 需要将姓输入框的前3位取出…

Vue计算属性

目录 1.姓名案例--插值语法实现 2.姓名案例 --methods实现 3.姓名案例--计算属性实现 1.计算属性的定义 2.计算属性所写的位置和写法形式 3.计算属性通过什么来调用(读取&#xff09; 4.计算属性中的两个方法&#xff1a;get和set作用是什么&#xff1f;什么时候调用&…