MySql的mvcc原理

目录

一、什么是mvcc?

二、什么是当前读,快照读?

当前读

快照读

三、mvcc实现原理

版本链

undo日志

Undo log 的用途

Read View(读视图)

Read View几个属性

五、RR、RC级别下生成时机


一、什么是mvcc?

mvcc全称Multi-Version Concurrency Control,即多版本并发控制,主要是为了提高数据库的并发性能,同一行数据平时发生读写请求时,会上锁阻塞住。但mvcc用更好的方式去处理读—写请求,做到在发生读—写请求冲突时不用加锁。这个读是指的快照读,而不是当前读,当前读是一种加锁操作,是悲观锁

二、什么是当前读,快照读?

当前读

它读取的数据库记录,都是当前最新的版本,会对当前读取的数据进行加锁,防止其他事务修改数据。是悲观锁的一种操作。

如下操作都是当前读:

select lock in share mode (共享锁)

select for update (排他锁)

update (排他锁)

insert (排他锁)

delete (排他锁)

串行化事务隔离级别

快照读

快照读的实现是基于多版本并发控制,即MVCC,既然是多版本,那么快照读读到的数据不一定是当前最新的数据,有可能是之前历史版本的数据。

如下操作是快照读:

  • 不加锁的select操作(注:事务级别不是串行化)

三、mvcc实现原理

 它的实现原理主要是版本链undo日志 ,Read View来实现的

版本链

我们数据库中的每行数据,除了我们肉眼看见的数据,还有几个隐藏字段。分别是db_trx_id、db_roll_pointer、db_row_id。

db_trx_id

6byte,最近修改(修改/插入)事务ID:记录创建这条记录/最后一次修改该记录的事务ID。

db_roll_pointer(版本链关键)

7byte,回滚指针,指向这条记录的上一个版本(存储于rollback segment里)

db_row_id

6byte,隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以db_row_id产生一个聚簇索引。

实际还有一个删除flag隐藏字段, 记录被更新或删除并不代表真的删除,而是删除flag变了

如上图,db_row_id是数据库默认为该行记录生成的唯一隐式主键,db_trx_id是当前操作该记录的事务ID,而db_roll_pointer是一个回滚指针,用于配合undo日志,指向上一个旧版本。

每次对数据库记录进行改动,都会记录一条undo日志,每条undo日志也都有一个roll_pointer属性(INSERT操作对应的undo日志没有该属性,因为该记录并没有更早的版本),可以将这些undo日志都连起来,串成一个链表,所以现在的情况就像下图一样:

对该记录每次更新后,都会将旧值放到一条undo日志中,就算是该记录的一个旧版本,随着更新次数的增多,所有的版本都会被roll_pointer属性连接成一个链表,我们把这个链表称之为版本链,版本链的头节点就是当前记录最新的值。另外,每个版本中还包含生成该版本时对应的事务id,这个信息很重要,在根据ReadView判断版本可见性的时候会用到。

undo日志

Undo log 主要用于记录数据被修改之前的日志,在表信息修改之前先会把数据拷贝到undo log里。

当事务进行回滚时可以通过undo log 里的日志进行数据还原。

Undo log 的用途

保证事务进行rollback时的原子性和一致性,当事务进行回滚的时候可以用undo log的数据进行恢复。

用于MVCC快照读的数据,在MVCC多版本控制中,通过读取undo log的历史版本数据可以实现不同事务版本号都拥有自己独立的快照数据版本。

Read View(读视图)

事务进行快照读操作的时候生产的读视图(Read View),在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照。

记录并维护系统当前活跃事务的ID(没有commit,当每个事务开启时,都会被分配一个ID, 这个ID是递增的,所以越新的事务,ID值越大),是系统中当前不应该被本事务看到的其他事务id列表。

Read View主要是用来做可见性判断的, 即当我们某个事务执行快照读的时候,对该记录创建一个Read View读视图,把它比作条件用来判断当前事务能够看到哪个版本的数据,既可能是当前最新的数据,也有可能是该行记录的undo log里面的某个版本的数据。

Read View几个属性

trx_ids: 当前系统活跃(未提交)事务版本号集合。

low_limit_id: 创建当前read view 时“当前系统最大事务id。

up_limit_id: 创建当前read view 时“系统正处于活跃事务最小id”

creator_trx_id: 创建当前read view的事务id;

如下图 trx_ids 对应[100,200]是个数组,low_limit_id对应300,up_limit_id则对应100

db_trx_id < up_limit_id || db_trx_id == creator_trx_id(显示)

如果数据事务ID小于read view中的最小活跃事务ID,则可以肯定该数据是在当前事务启之前就已经存在了的,所以可以显示。

或者数据的事务ID等于creator_trx_id ,那么说明这个数据就是当前事务自己生成的,自己生成的数据自己当然能看见,所以这种情况下此数据也是可以显示的。

db_trx_id >= low_limit_id(不显示)

如果数据事务ID大于read view 中的当前系统的最大事务ID,则说明该数据是在当前read view 创建之后才产生的,所以数据不显示。如果小于则进入下一个判断

db_trx_id是否在活跃事务(trx_ids)中

不存在:则说明read view产生的时候事务已经commit了,这种情况数据则可以显示。

已存在:则代表我Read View生成时刻,你这个事务还在活跃,还没有Commit,你修改的数据,我当前事务也是看不见的。

五、RR、RC级别下生成时机

RC隔离级别下,是每个快照读都会生成并获取最新的Read View;

而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View,之后的查询就不会重复生成了,所以一个事务的查询结果每次都是一样的。

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

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

相关文章

迪文屏开发保姆级教程5—表盘时钟和文本RTC显示

这篇文章要讲啥事呢&#xff1f; 本篇文章主要介绍了在DGBUS平台上使用表盘时钟和文本时钟RTC显示功能的方法。 文哥悄悄话&#xff1a; 官方开发指南PDF&#xff1a;&#xff08;不方便下载的私聊我发给你&#xff09; https://download.csdn.net/download/qq_21370051/8864…

Flowable-升级为7.0.0.M2-第一节

目录 升级jdk升级springboot到3.1.3升级数据库连接池druid-spring-boot-3-starter到1.2.20升级mybatis-plus到3.5.3.2升级flowable到7.0.0.M2 最近有些读者一直问flowable如何升级到7.0.0.M2&#xff0c;接下来我就一步步的把flowable升级到7.0.0.M2 升级jdk flowable7.x采用的…

算法导论复习(四)主方法的专题

主方法我们要记住的是什么呢&#xff1f;

浅谈矿山井下IT配电系统绝缘监测的应用

摘要&#xff1a;众所周知&#xff0c;能源作为经济发展的重要引擎&#xff0c;堪称是国民经济的命脉。采矿业一直是能源工业的重要支柱&#xff0c;我国的矿业生产主要来自井下开采&#xff0c;环境恶劣&#xff0c;就以煤矿为例&#xff0c;煤矿井下存在水、火、瓦斯、煤尘、…

Shell三剑客:awk(awk编辑编程)二

一、IF 语句 IF 条件语句语法格式 #方式一&#xff1a; if (condition)action #方式二&#xff1a;使用花括号语法格式 if (condition) {action1;action2; ... } {if(表达式)&#xff5b;语句1;语句2;...&#xff5d;} IF 语句实例 #判断数字是奇数还是偶数 [rootlocalhost ~…

11.1Linux串口应用程序开发

UART简介 UART的全称是Universal Asynchronous Receiver and Transmitter&#xff0c;即异步发送和接收。 串口在嵌入式中用途非常的广泛&#xff0c;主要的用途有&#xff1a; 打印调试信息&#xff1b;外接各种模块&#xff1a;GPS、蓝牙&#xff1b; 串口因为结构简单、稳…

css的定位

为什么需要定位&#xff1f; 场景&#xff1a; 某个元素可以自由的在一个盒子内移动位置&#xff0c;并且压住其他盒子当我们滚动窗口的时候&#xff0c;盒子是固定屏幕某个位置的。 这二个需求&#xff0c;使用标准流和浮动的方式是无法实现的或者是不容易实现&#xff0c;所以…

【C++】string

文章目录 1. 标准库中的string类1.1 string类 2 string类的常用接口说明2.1 string类对象的常见构造2.2 string类对象的容量操作2.3. string类对象的访问及遍历操作2.4 string类对象的修改操作2.5 string类非成员函数2.6 vs和g下string结构的说明 1. 标准库中的string类 1.1 s…

ELK----filebeat日志收集工具

ELK&#xff1a;filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小的多。 filebeat可以运行在非java环境。他可以代理logstash在非java环境上收集日志 filebeat无法实现数据的过滤&…

基于JavaServelet的同学录管理系统(Java毕业设计)

点击咨询源码 大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的…

锐捷配置DHCP动态分配地址

一、实验拓扑 二、实验目的 配置DHCP为四个部门动态分配IP地址 三、实验配置 第一步&#xff1a;配置基本IP地址并对端口进行规划 SW1 SW1(config)#vlan range 10,20,30,40,100 SW1(config-vlan-range)#exit SW1(config)#interface vlan 10 SW1(config-if-VLAN 10)#ip addres…

解决 Linux git push 贡献者不同(没有出现绿点)的问题

第一步&#xff0c;通过下面的指令&#xff0c;修改 linux git 的配置文件&#xff1a; vi ~/.gitconfig会进入下图界面&#xff1a; 进入本地&#xff08;Windows&#xff09;中 git 的设置界面 复制 名称 和 Email 到 gitconfig 里&#xff0c;不要在末尾加 &#xff08;空…

Java原来可以这么玩!CV实现多张图片生成视频

前言 比如我像将几张图片变成一个视频的形式发不到短视频平台&#xff0c;虽然短视频平台也有上传图片变成视频的功能&#xff0c;但是我想要具体控制每张图片显示多久后切换到下一个图片&#xff0c;短视频平台目前无法实现&#xff0c;于是乎&#xff0c;我用java代码实现了…

【数据结构】C语言实现链式二叉树(附完整运行代码)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.项目功能演示 三.逐步实现项目功能模块及其逻辑详解 1.实现链式二叉树程序菜单 2.实现链式二叉树程序功能可循环使用 3.实现链式二叉树的新结点…

LeetCode-回文链表(234)

题目描述&#xff1a; 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 因为这一题是受到876题求链表中间节点的启发&#xff0c;所以在这里也加一下。 876.链表的中间结点…

探索 HTTP 请求的世界:get 和 post 的奥秘(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

在Go语言中实现HTTP中间件

在Web开发中&#xff0c;中间件是一种非常流行的设计模式&#xff0c;它可以用于处理请求、拦截请求并对其进行处理或转换。而在Go语言中&#xff0c;实现HTTP中间件就像给自己的HTTP服务器穿上了一层“魔法外衣”&#xff0c;让它变得更加灵活、可配置和可扩展。下面&#xff…

有可以平替SSL证书的数字证书吗

SSL证书和数字证书并不是完全等价的概念。SSL证书是一种数字证书的一种应用&#xff0c;用于在网络中加密和身份验证。数字证书是一种用于加密通信和验证身份的技术&#xff0c;SSL证书就是数字证书的一种特定形式。 除了SSL证书之外&#xff0c;还有其他类型的数字证书&#…

QT trimmed和simplified

trimmed&#xff1a;去除了字符串开头前和结尾后的空白&#xff1b; simplified&#xff1a;去除了字符串开头前和结尾后的空白&#xff0c;以及中间内部的空白字符也去掉&#xff08;\t,\n,\v,\f,\r和 &#xff09; 代码&#xff1a; QString str " 1 2 3 4 5 …

Apache Commons BeanUtils: JavaBean操作的艺术

第1部分&#xff1a;Apache Commons BeanUtils 简介 咱们今天聊聊Apache Commons BeanUtils。这货简直就是处理JavaBean的利器&#xff0c;用起来又方便又快捷。不管是属性拷贝、类型转换&#xff0c;还是动态访问&#xff0c;BeanUtils都能轻松应对。 BeanUtils是啥&#xf…