Mysql学习之MVCC解决读写问题

多版本并发控制

什么是MVCC
MVCC (Multiversion Concurrency Control)多版本并发控制。顾名思义,MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。

快照读与当前读
在这里插入图片描述
在这里插入图片描述
再谈隔离级别
在这里插入图片描述

MVCC 可以不采用锁机制,而是通过乐观锁的方式来解决不可重复读和幻读问题!它可以在大多数情况下替代行级锁,降低系统的开销。
在这里插入图片描述
隐藏字段、Undo Log 版本链
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
MVCC实现原理之ReadView

MVCC的实现依赖于:隐藏字段、Undo log版本链、ReadView
什么是ReadView?
在MVCC机制中,多个事务对同一个行记录进行更新会产生多个历史快照,这些历史快照保存在Undo Log里**。如果一个事务想要查询这个行记录,需要读取哪个版本的行记录呢?这时就需要用到ReadView了**,它帮助我们解决了行的可见性问题。
ReadView就是事务在使用MVCC机制进行快照读操作时产生的读视图。当事务启动时,会生成数据库系统当前的一个快照,InnoDB为每个事务构造了一个数组,用来记录并维护系统当前活跃事务的ID(“活跃”指的就是,启动了但还没提交)
设计思路
在这里插入图片描述
ReadView要解决的主要问题就是需要判断一下版本链中的哪个版本是当前事务可见的。
在这里插入图片描述
在这里插入图片描述
ReadView的规则
有了ReadView,在访问某条记录时,只需要按照下面的步骤判断记录的某个版本是否可见。

  • 如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。

  • 如果被访问版本的trx_id值小于ReadView中的up_limit_id值,表明生成该版本的事务在当前事务生成ReadView前已提交,所以该版本可以被当前事务访问。

  • 如果被访问版本的trx_id值大于或等于ReadView中low_limit_id值,表明生成该版本的事务在当前事务生成的ReadView后才开启,所以该版本不可以被当前事务访问。

  • 如果被访问版本的trx_id值在ReadView的up_limit_id和low_limit_id之间,那就需要判断一下trx_id属性值是不是在trx_ids列表中。

    如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问。
    如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问。

MVCC整体操作流程

在这里插入图片描述
事务的隔离级别为读已提交时,一个事务中的每一次SELECT查询都会重新获取一次Read View。
在这里插入图片描述
事务隔离级别为可重复读时,就避免了不可重复读。这是因为一个事务只在第一次SELECT的时候会获取一次Read View,而后面的所有的SELECT都会复用这个Read view。
在这里插入图片描述
举例说明
在这里插入图片描述
READ COMMITTED 隔离级别下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
之后,把事务id为10的事务提交
在这里插入图片描述
在这里插入图片描述
这个时候再读一次:
在这里插入图片描述执行过程分析:
在这里插入图片描述
在这里插入图片描述
REPEATABLE READ隔离级别下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如何解决幻读?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结

在这里插入图片描述
在这里插入图片描述
B站链接

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

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

相关文章

django的模板渲染中的【高级定制】:按数据下标id来提取数据

需求: 1:在一个页面中显示一张数据表的数据 2:不能使用遍历的方式 3:页面中的数据允许通过admin后台来进行修改 4:把一张数据表的某些内容渲染到[xxx.html]页面 5:如公司的新商品页面,已有固定的…

《梦幻西游》本人收集的34个单机版游戏,有详细的视频架设教程,值得收藏

梦幻西游这款游戏,很多人玩,喜欢研究的赶快下载吧。精心收集的34个版本。不容易啊。里面有详细的视频架设教程,可以外网呢。 《梦幻西游》本人收集的34个单机版游戏,有详细的视频架设教程,值得收藏 下载地址&#xff1…

FDM打印机学习

以下内容摘自网络,仅供学习讨论,侵删。 持续更新。。。 FDM打印机是通过喷头融化丝状耗材(PLA,ABS等材料),然后逐层涂在热床上,一层一层逐级抬高。 结构分类 Prusa i3型是一种龙门结构&#…

JavaWeb 下拉菜单怎么实现选择不同的颜色?

在JavaWeb中实现下拉菜单选择不同颜色的功能是一种常见的需求&#xff0c;可以通过HTML、CSS和JavaScript结合Java后端来实现。 第一步&#xff1a;编写HTML页面 首先&#xff0c;我们需要创建一个HTML页面&#xff0c;其中包含一个下拉菜单和一个用于显示颜色的区域。 <…

python 爬取文本内容并写入json文件

背景: 项目需要从html 提取说明书目录 实现: 由于html是包含所有内容,所以将其中目录部分手动重新生成一个html 文件dir26.html python import requests from bs4 import BeautifulSoup import jsonfilename "dir26.html" # 替换为实际的文件路径 with open(fil…

ES 备份索引

1、先创建索引 PUT file_info_sps_demo1 {"settings": {"index": {"number_of_shards": "1","blocks": {"read_only_allow_delete": "true"},"max_result_window": "500000",&quo…

阶跃信号与冲击信号

奇异信号&#xff1a;信号与系统分析中&#xff0c;经常遇到函数本身有不连续点&#xff08;跳变电&#xff09;或其导函数与积分有不连续点的情况&#xff0c;这类函数称为奇异函数或奇异信号&#xff0c;也称之为突变信号。以下为一些常见奇异函数。 奇异信号 单位斜变信号 …

C#双向链表实现:Append()方法追加并显示数据

目录 一、涉及到的知识点 1.定义 2.双向链表与单向链表的区别 二、实例 一、涉及到的知识点 1.定义 在双向链表中&#xff0c;每个节点有两个指针域&#xff0c;一个指向它的前一个节点&#xff08;即直接前驱&#xff09;&#xff0c;另一个指向它的后一个节点&#xff0…

Ubuntu18.04安装RTX2060显卡驱动+CUDA+cuDNN

Ubuntu18.04安装RTX2060显卡驱动CUDAcuDNN 1 安装RTX2060显卡驱动1.1 查看当前显卡是否被识别1.2 安装驱动依赖1.3 安装桌面显示管理器1.4 下载显卡驱动1.5 禁用nouveau1.6 安装驱动1.7 查看驱动安装情况 2 安装CUDA2.1 查看当前显卡支持的CUDA版本2.2 下载CUDA Toolkit2.3 安装…

车灯修复UV胶的优缺点有哪些?

车灯修复UV胶的优点如下&#xff1a; 优点&#xff1a; 快速固化&#xff1a;通过紫外光照射&#xff0c;UV胶可以在5-15秒内迅速固化&#xff0c;提高了修复效率。高度透明&#xff1a;固化后透光率高&#xff0c;几乎与原始车灯材料无法区分&#xff0c;修复后车灯外观更加…

对缓冲区的初步认识——制作进度条小程序

对缓冲区的初步认识--进度条小程序 前言预备知识回车和换行的区别输出缓冲区/n 有清空输出缓冲区的作用stdout是什么&#xff1f;验证一切皆文件为什么是\n行刷新&#xff1f; 倒计时程序原理 代码实现为什么这里要强制刷新&#xff1f;没有会怎样&#xff1f;为什么是输出的是…

RabbitMQ安装及使用

系列文章目录 文章目录 系列文章目录前言一、下载二、安装三、插件安装四、配置五、权限六、集群模式 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&…

【MATLAB源码-第154期】基于matlab的OFDM系统多径信道下块状和梳妆两种导频插入方式误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交频分复用&#xff09;是一种高效的无线信号传输技术&#xff0c;广泛应用于现代通信系统&#xff0c;如Wi-Fi、LTE和5G。OFDM通过将宽带信道划分…

[机缘参悟-158] :西游记中的“佛” 、“道”之争

目录 前言 一、西游记中的佛教元素 1.1 佛教元素 1.2 西游记佛教思想 1.3 佛教的三界五行&#xff1a;物质世界 1.4 佛教中不在三界内&#xff0c;不在五行中&#xff1a;精神世界 二、西游记中的道教元素 2.1 主要元素 2.2 道家思想 三、“佛”如何兼容“道” 3.1 …

RK3568 Android12 适配抖音 各大APP

RK3568 Android12 适配抖音 各大APP SOC RK3568 system:Android 12 平台要适配抖音和各大APP 平台首先打开抖音发现摄像头预览尺寸不对只存在右上角,我将抖音APP装在手机上预览,发现是全屏 一开始浏览各大博客 给出的解决方法是修改framework 设置为全屏显示: framewo…

2369. 检查数组是否存在有效划分

2369. 检查数组是否存在有效划分 题目链接&#xff1a;2369. 检查数组是否存在有效划分 代码如下&#xff1a; //动态规划 class Solution { public:bool validPartition(vector<int>& nums) {vector<int> dp(nums.size()1,false);//dp[i]表示前i个元素组成的…

Tomcat基础及与Nginx实现动静分离,搭建高效稳定的个人博客系统

目录 引言 一、TOMCAT基础功能 &#xff08;一&#xff09;自动解压war包 &#xff08;二&#xff09;状态页 1.登录状态页 2.远程登录 &#xff08;三&#xff09;服务管理界面 &#xff08;四&#xff09;Host虚拟主机 1.设置虚拟主机 2.建立站点目录与文件 二、实…

使用QEMU搭建U-Boot+LinuxKernel+busybox+NFS嵌入式开发环境

目录 0.课程大纲1.为什么要使用QEMU学习嵌入式QEMU简介使用QEMU可以做哪些事情?当前嵌入式行业现状如何适应这种变化使用QEMU学习嵌入式有哪些好处?驱动开发技能为什么要学习Linux 2.搭建嵌入式开发基本环境2.1.安装u-boot-tools2.2.安装交叉编译工具什么是ABI和EABI 3.QEMU安…

三、基准时钟、生成时钟、虚拟时钟的约束和意义

**前言&#xff1a;**前面从理论角度出发学习了时序分析的基本原理&#xff0c;本篇从设计的角度学习如何合理添加时钟约束。 文章目录 一、基准时钟&#xff08;base clock&#xff09;和生成时钟(generate clock)二、基准时钟的约束1.完成综合&#xff08;run implementatio…

linux的通信方案(SYSTEM V)

文章目录 共享内存(Share Memory)信号队列&#xff08;Message Queue&#xff09;信号量(semaphore) 进程间通信的核心理念&#xff1a;让不同的进程看见同一块资源 linux下的通信方案&#xff1a; SYSTEM V 共享内存(Share Memory) 特点&#xff1a;1.共享内存是进程见通信最…