MySQL的 MVCC详解

MVCC是多版本并发控制,允许多个事务同时读取和写入数据库,而无需互相等待,从而提高数据库的并发性能。

在 MVCC 中,数据库为每个事务创建一个数据快照。每当数据被修改时,MySQL不会立即覆盖原有数据,而是生成新版本的记录。每个记录都保留了对应的版本号或时间戳。

依赖实现:隐藏字段(rowId+trxId)+undolog+readview

MVCC本质是采用乐观锁思想, 非阻塞并发读 ,而这个读指的就是快照读 , 而非当前读

  • 当前读就是加锁操作,是悲观锁的实现。当前读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录

SELECT ... FOR UPDATE           #为查询到的每一条记录添加排他锁  
SELECT ... LOCK IN SHARE MODE   #为查询到的每一条记录添加共享锁
  • 快照读又叫一致性读,读的是快照数据,可能不是最新数据,而是历史数据,不加锁的 简单select都属于快照读

ReadView

隐藏字段和 undo 版本链决定是时返回的数据,具体返回哪个数据版本,由这个ReadView控制,即 进行快照读操作时产生的读视图

设计思路

这个ReadView其实就是维护了一个集合,主要包含4个部分,分别如下:

  • creator_trx_id,创建这个 Read View 的事务 ID

  • trx_ids: 表示在生成 ReadView 时当前系统中活跃的读写事务的事务id列表

  • up_limit_id:活跃事务中最小的事务 ID

  • low_limit_id:生成 ReadView 时,应该分配给下一个事务的 ID 值。(最大事务 ID +1)

规则

有了ReadView,那么在访问某条记录时,只需要按照下边的步骤查看记录的对应快照版本

整体操作流程

比如查询一条记录的时候,系统如何通过MVCC找到它:

  1. 首先获取事务自己的版本号trxId,也就是事务 ID;

  2. 获取 当前的系统的 ReadView ,然后与 ReadView 中的事务版本号进行比较;

  3. 如果不符合 ReadView 规则,就从 Undo Log版本链中依次往下获取该记录的历史快照事务ID进行按照上面规则比较;

  4. 最后返回符合规则的数据。若最后一个版本都不可见,说明该条记录对于目前该事务完全不可见(没提交),也就查不到该条记录

读已提交和可重复读

在隔离级别为读已提交时,一个事务中的每一次SELECT查询都会重新获取一次Read View。

这时如果 Read View 不同,就可能产生不可重复读或者幻读的情况

当隔离级别为可重复读的时候,解决了不可重复读,并通过 间隙锁+MVCC 解决了大部分的幻读问题

大部分幻读解决:

  • 因为可重复读复用,第一次readView,所以事务的查询快照结果是一样,不会平白无故多出数据来,通过readView解决了快照读的幻读

  • 间隙锁的话解决了当前读的幻读问题,防止其他事务在这个间隙间插入新的记录。

例外情况:

  • 比如,如果两个事务,事务1先进行快照读,然后事务2插入了一条记录并提交,在事务1中进行了当前读之后,再进行快照读也会发生幻读。

因为此时一个事务只在第一次 SELECT 的时候会获取一次 Read View,而后面所有的查询都会复用这个 Read View

举例说明
读已提交

每次读取数据前都生成一个ReadView

-- 现在有两个 事务id 分别为 10 、 20 的事务在执行
​
# Transaction 10
BEGIN;
UPDATE student SET name="李四" WHERE id=1;
UPDATE student SET name="王五" WHERE id=1;
​
# Transaction 20
BEGIN;
# 更新了一些别的表的记录
...

此刻,表student 中 id1 的记录得到的版本链表如下所示:

假设现在有一个使用 READ COMMITTED 隔离级别的事务30开始执行:

# 使用READ COMMITTED隔离级别的事务
BEGIN;
# SELECT1:Transaction 10、20未提交
SELECT * FROM student WHERE id = 1; # 得到的列name的值为'张三',因为王五李四事务是活跃的,所以查undolog 读取历史快照张三

之后,我们把 事务id10 的事务提交一下:

# Transaction 10
COMMIT;

然后再到 事务id20 的事务中更新一下表 studentid1 的记录:

# Transaction 20
...
UPDATE student SET name="钱七" WHERE id=1;
UPDATE student SET name="宋八" WHERE id=1;

此刻,表student中 id1的记录的版本链就长这样:

然后再到事务30中继续查找这个 id 为 1 的记录

# SELECT2:Transaction 10提交,Transaction 20未提交
SELECT * FROM student WHERE id = 1;   # 得到的列name的值为'王五'

所以看到,两次读取的记录并不一样,所以不可重复嘛

可重复读

只会在第一次执行查询语句时生成一个 ReadView ,之后的查询就不会重复生成

得到的列name的值仍为'张三',因为复用第一次的readview,所以上图还是认为王五没有提交

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

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

相关文章

【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据

一、下载z-paing插件 注意下载下载量最多的这个 进入Hbuilder以后点击“确定” 插件的官方文档地址: https://z-paging.zxlee.cn 二、z-paging插件的使用 在文档中向下滑动,会有使用方法。 使用z-paging标签将所有的内容包起来 配置标签中的属性 在s…

UG NX二次开发(Python)-API函数介绍与应用实例(三)-UFLayer类操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1 前言2、UFLayer类说明3、获取当前工作图层4、移动对象到特定的图层1 前言 采用Python语言进行UG NX二次开发的帮助材料很少,采用录制的方法是一种比较容易实现的方式,但是使用UFun函数更容易上…

免费PDF 转换成 Word、PPT、Excel 格式的工具

在当今数字化办公的时代,文件格式的转换需求日益频繁。我们的软件应运而生,它是一款专业的 PDF 转换成 Word、PPT、Excel 格式的工具,为您的办公流程带来极大便利。 下载地址:https://pan.quark.cn/s/8c42ac2e4bf5 核心功能&…

deepseek从网络拓扑图生成说明文字实例

deepseek对话页面中输入问题指令: 我是安全测评工程师,正在撰写系统测评报告,现在需要对系统网络架构进行详细说明,请根据附件网络拓扑图输出详细说明文字。用总分的段落结构,先介绍各网络区域,再介绍网络…

排序算法--希尔排序

希尔排序是插入排序的改进版本,适合中等规模数据排序,性能优于简单插入排序。 // 希尔排序函数 void shellSort(int arr[], int n) {// 初始间隔(gap)为数组长度的一半,逐步缩小for (int gap n / 2; gap > 0; gap …

【NR-NTN】3GPP Release 18中NR-NTN过程描述

本文参考3GPP规范: 【1】《TS 38.300 V18.4.0 NR; NR and NG-RAN Overall Description; Stage2》 1. 概述 图1展示了一个非地面网络(NTN)的示例,通过NTN载荷和NTN网关为用户设备(UE)提供非地面NR接入。图…

python3中错误与异常初识

一. 简介 在 编写 Python时,经常会遇到一些报错信息。接下来开始学习 Python3 中错误和异常。 本文首先初步了解一下 Python3中的错误和异常。 二. python3 中错误与异常初识 Python 中有两种错误:语法错误与异常。 1. 语法错误 Python 的语法错误…

一文解释nn、nn.Module与nn.functional的用法与区别

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀零基础入门PyTorch框架_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 …

“AI隐患识别系统,安全多了道“智能护盾”

家人们,在生活和工作里,咱们都知道安全那可是头等大事。不管是走在马路上,还是在工厂车间忙碌,又或是住在高楼大厦里,身边都可能藏着一些安全隐患。以前,发现这些隐患大多靠咱们的眼睛和经验,可…

口腔扫描仪(口扫)核心算法——点云三维重建

口腔扫描仪(口扫)的核心算法涉及三维点云获取、配准、去噪、补全及表面重建等多个技术环节,以下从技术原理、关键算法和应用挑战进行详细解析: 1. 数据采集与成像原理 口腔扫描的核心在于快速、高精度获取牙齿与软组织表面几何信…

VLL CCC远程连接实验

1、CE1和CE2的配置 CE1和CE2的配置很简单,只需要在接口E0/0/0上配置ip地址即可; 2、PE1的配置 配置CCC名称为CE1-CE2,将E0/0/1(连接CE1)作为入接口,入标签为100,出去的时候换成200&#xff0c…

讯飞智作 AI 配音技术浅析(四):语音特征提取与建模

语音特征提取与建模是讯飞智作 AI 配音技术的核心环节,旨在将文本信息转化为高质量的语音信号。该过程依赖于深度学习模型,通过对大量高质量语音数据的训练,提取出关键的声学特征(如音素、音节、语调、语速等)&#xf…

Java 大视界 -- Java 大数据在智能教育中的应用与个性化学习(75)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 一、…

【MySQL】centos 7 忘记数据库密码

vim /etc/my.cnf文件; 在[mysqld]后添加skip-grant-tables(登录时跳过权限检查) 重启MySQL服务:sudo systemctl restart mysqld 登录mysql,输入mysql –uroot –p;直接回车(Enter) 输…

Linux 源码编译安装httpd 2.4,提供系统服务管理脚本并测试

第一种方式 1. 下载 Apache HTTP Server 源代码 首先,从 Apache 官网 下载最新版本的 httpd 2.4 源码,或者直接使用 wget 下载: [rootlocalhost ~]# wget https://downloads.apache.org/httpd/httpd-2.4.36.tar.gz # 解压 [rootlocalhost ~…

【重生之学习C语言----杨辉三角篇】

目录 ​编辑 --------------------------------------begin---------------------------------------- 一、什么是杨辉三角? 二、问题分析 三、算法设计 使用二维数组存储杨辉三角: 递推关系: 格式化输出: 四、代码实现 完…

绿联NAS安装cpolar内网穿透工具实现无公网IP远程访问教程

文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 本文主要介绍如何在绿联NAS中使用ssh远程连接后,使用一行代码快速安装cpolar内网穿透工具,轻松实现随时随地远程访问本地内网中的绿联NAS,无需公网…

C语言-----数据结构从门到精通

1.数据结构基本概念 数据结构是计算机中存储、组织数据的方式,旨在提高数据的访问和操作效率。它是实现高效算法和程序设计的基石。 目标:通过思维导图了解数据结构的知识点,并掌握。 1.1逻辑结构 逻辑结构主要四种类型: 集合:结构中的数据元素之…

使用Pygame制作“打砖块”游戏

1. 前言 打砖块(Breakout / Arkanoid) 是一款经典街机游戏,玩家控制一个可左右移动的挡板,接住并反弹球,击碎屏幕上方的砖块。随着砖块被击碎,不仅能获得分数,还可以体验到不断加速或复杂的反弹…

Linux——基础命令1

$:普通用户 #:超级用户 cd 切换目录 cd 目录 (进入目录) cd ../ (返回上一级目录) cd ~ (切换到当前用户的家目录) cd - (返回上次目录) pwd 输出当前目录…