MySQL--深入理解MVCC机制原理

什么是MVCC?

MVCC全称 Multi-Version Concurrency Control,即多版本并发控制,维持一个数据的多个版本,主要是为了提升数据库的并发访问性能,用更高性能的方式去处理数据库读写冲突问题,实现无锁并发。

什么是快照读和当前读?

  • 快照读:不加锁非阻塞读,快照读要求数据库隔离级别不能是串行化,否则会退化到当前读,快照读是基于多版本并发控制的,因为是基于多版本并发控制,所以快照读可能读取的不是最新的数据。
  • 当前读:当前读就是读取最新的数据版本,快照读读取的时候,会对读取的数据加锁,读取的时候其他事务不能修改当前数据。

MVCC和快照读、当前读的关系?

MVCC 多版本并发控制,而快照就是数据的一个版本,MVCC 的无锁并发就是依赖快照读机制实现的。

MVCC的实现原理?

MVCC 实现依赖于数据库记录中的三个隐式字段、undo日志、Read View 版本链,本篇讨论皆基于 MySQL 的 InnoDB 存储引擎。

三个隐式字段:

隐式字段,是我们正常来看看不到的字段,数据库的每行数据除了我们看到的字段之外,还有三个我们看不到的字段。

  • DB_TRX_ID:记录当前事务最后一次修改的事务ID,即事务 ID,事务 ID 是递增的。
  • DB_ROW_ID:隐藏的自增主键ID,如果数据库没有主键ID,数据库会自动生成一个 6个字节的 DB_ROW_ID。
  • DB_ROLL_PTR:回滚指针,指向上一个数据版本。

简单图例:

在这里插入图片描述

undo log 日志:

我们都知道undo log 日志是回滚日志,是数据库保证数据一致性的一个支撑,当出现异常情况时候,通过 undo log 日志来进行数据回滚,其实它还有其他作用,undo log 又分为两种,如下:

  • insert undo log,insert 操作时候产生的日志,只会在发生异常需要进行回滚的时候使用,事务提交后,undo log 就没有用处了,就会被丢弃。
  • update undo log 和 delete undo log,这两类 undo log 不仅在事务回滚时候要用到,同时在快照读的时候也会用到。

undo log 也会记录一条版本链表,每次修改数据的时候,数据库会先把当前数据拷贝一份到 undo log中,然后再对数据进行修改,最在undo log 中最新修改的数据副本会在链的头部,同时它有一个回滚指针指向他的上一个版本。

Read View:

Read View 是事务执行快照读产生的视图,在事务执行快照读的时候,系统会以当前时刻生成一个快照,以此来维护系统此时活跃的事务id,用来做可见性判断,当某个事务进行快照读的时候,我们根据 Read View 来判断当前事务可以读取哪个版本的数据,然后就去该数据的 undo log 里面找数据,当然也可能是读取最新的数据。

Read View 遵守可见性规则,它的三个属性如下:

  • trx_list:用来维护 Read View 生成时候系统活跃的事务ID,是一个列表。
  • up_limit_id:活跃事务ID中最小的ID。
  • low_limit_id:Read View 生成时候,系统将要分配的下一个事务ID。

可见性算法主要是把要修改的数据的最新版本的事务ID,即DB_TRX_ID取出来,与当前系统中活跃的其他事务ID去对比,而Read View 就维护了这些活跃的事务ID,如果在 Read View 中找不到合适条件的数据记录,就会去 undo log 日志根据回滚指针 DB_ROLL_PTR 来找数据记录直到找到为止。

Read View 的比较流程如下:

注意事务ID 是递增的。

  • 第一步,比较 DB_TRX_ID < up_limit_id, 是否小于活跃事务 Read View中最小的事务ID,如果小于,则当前事务能看到 DB_TRX_ID 所在的记录,否则进入第二个判断。
  • 第二步,比较 DB_TRX_ID >=low_limit_id, 是否大于等于下一个将要发生的事务ID,如果大于等于则代表 DB_TRX_ID 所在的记录在 Read View生成后才出现的,那对当前事务肯定不可见,否则进入第三个判断。
  • 第三步, 判断 DB_TRX_ID 是否在活跃事务 Read View 之中,如果在,则代表我 Read View 生成时刻,你这个事务还在活跃,还没有Commit,你修改的数据,我当前事务也是看不见的,如果不在,则说明,这个事务在 Read View 生成之前就已经 Commit 了,因为第一步、第二步已经判断了是否小于最小活跃事务ID和是否是将要发生的事务ID,两者都不是,同时又不在 活跃事务 Read View 中,只能说明在这个事务 Read View 在当前是事务发生之前了,当前事务理所当然能够看到。

简易流程如下:

在这里插入图片描述

读已提交(Read Committed)、可重复读(Repeatable Read) 隔离级别下的快照读的区别?

读已提交(Read Committed)、可重复读(Repeatable Read) 隔离级别下的快照读最大的区别就是生成 Read View 时机不同。

  • 可重复读(Repeatable Read) 隔离级别下,一个事务只有在第一次读取数据的时候生成一个Read View,Read View 记录当前活跃的事务ID,后面继续读取数据时候,如果用到快照读,那他使用的还是第一次读取时候的 Read View,这也是为什么可重复读(Repeatable Read) 隔离级别下,看不到别的事务的修改记录的原因。
  • 读已提交(Read Committed) 隔离级别下,事务开启后,每次使用快照读的时候,都会重新生成一个活跃事务ID,第一读取和第二次读取使用的不是同一个 Read View,那第二次读取的时候,第一次读取时候的 Read View 中的某些事务可能已经提交了,那在第二次快照读的时候就可以看到了,这也是在读已提交(Read Committed) 隔离级别下可以看到别的事务提交的记录的原因 。

MVCC解决了什么问题?

想要知道MVCC解决了什么问题,我们要先知道数据库多个事务并发访问会有什么问题,数据库并发访问场景如下:

  • 读读并发:多个事务同时读取同一份数据,不存在问题,无需进行并发控制。
  • 读写并发:多个事务同时读写同一份数据,有线程安全问题,可能会脏读、幻读、不可重复度问题。
  • 写写并发:多个事务同时对同一份数据写,可能会有更新丢失的情况。

而MVCC 就是解决以上三种并发中的读写并发问题,是一种无所并发控制,可以解决脏读、不可重复读问题,可以解决部分场景的幻读问题。

什么是幻读?MVCC可以解决幻读问题吗?

MVCC 可以解决快照读的幻读问题,MVCC 机制是依赖 快照读、undo log、Read View 来实现的,可以解决快照读的幻读问题,但是不能解决 update、delete 的幻读问题,因为这些操作是当前读。

以下讨论基于可重复读(Repeatable Read) 隔离级别。

当前读幻读演示:

时间事务A事务B
1开始事务
2第一次查询:select * from user where id > 1;
3开始事务
4执行insert: INSERT INTO user(id, user_name, user_code, age, address, hobby)VALUES(6, ‘赵六’, ‘TC-00000006’, 26, ‘广西’, ‘羽毛球’);
5提交事务
6第二次查询:select * from user where id > 1;
7修改数据:update user set name = ‘赵六国’ where id = 6;
8第三次查询:select * from user where id >1;
9提交事务

流程解释:

  • 在第2个时间点的时候,快照读,可以得到 id 大于 1的数据。
  • 在第6个时间点的时候,虽然时间点4插入了一条 id 为6的数据,并且在时间点5提交了事务,但是时间点6还是查询不到 id 为6的这条数据,查询结果和第2个时间点的查询结果没有区别。
  • 在第7个时间点的时候,查询结果就有了变化,因为 update 操作是当前读,而事务B在第5个时间点已经提交了一条 id 为6的数据,根据当前读的规则,此刻是可以读取到 id 为6 的数据,也就可以更新 id 为 6 的数据。
  • 第8个时间点的时候,执行第三次查询,此时是基于当前最新版本查询的,所以会查询到事务B提交的 id 为6的数据,对比第一次、第二次查询,多出了 id 为6的数据,这就是幻读

当前读的幻读问题怎么解决?

加锁解决,关于锁的介绍,传送门如下:

MySQL–锁机制详解

#共享锁
SELECT * FROM user LOCK IN SHARE MODE;  
# 排他锁
SELECT * FROM user FOR UPDATE; 
# 排他锁
INSERT INTO  user 
# 排他锁
UPDATE user 
# 排他锁
DELETE FROM  user 

注意:INSERT、UPDATE 、DELETE 操作数据库默认加排他锁。

解决幻读问题演示:

时间事务A事务B
1开始事务
2第一次查询:select * from user where id > 5 lock in share mode;
3事务A显示加了间隙锁
4开始事务
5执行insert: INSERT INTO user(id, user_name, user_code, age, address, hobby)VALUES(6, ‘赵六’, ‘TC-00000006’, 26, ‘广西’, ‘羽毛球’);
6阻塞了,处于等待状态
7select * from user where id > 5
8提交事务
9事务A提交了,释放了间隙锁,事务B 执行 INSERT 操作
10提交事务
  • 在第2个时间点的时候,使用 lock in share mode 语法显示加锁了,不仅表中存在的数据加锁了,而且还给 id>5 的区间加了间隙锁
  • 因为时间点2的操作,给 id>5 的区间加了间隙锁 ,所以事务B 在时间点5的时候执行 INSERT 操作的时候,出现了阻塞。
  • 因为时间点5的 INSERT 操作被阻塞了,所以这次查询的数据跟时间点2的查询结果完全一致。
  • 事务B想要执行 INSERT 成功,必须要等待事务A 提交事务释放锁,这就解决了幻读问题。

MVCC可以解决更新丢失问题吗?

MVCC 解决的是读写并发问题,而更新丢失是写写并发问题,MVCC不能解决更新丢失问题,更新丢失依赖数据库的隔离级别来解决。

如有不正确的地方请各位指出纠正。

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

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

相关文章

Mac上使用M1或M2芯片的设备安装Node.js时遇到一些问题,比如卡顿或性能问题

对于Mac上使用M1或M2芯片的设备可能会遇到在安装Node.js时遇到一些问题&#xff0c;比如卡顿或性能问题。这可能是因为某些软件包或工具在M1或M2芯片上的兼容性不佳。为了解决这个问题&#xff0c;您可以尝试以下方法&#xff1a; 1. 使用Rosetta模式 对于一些尚未适配M1或M2…

AI智能分析网关V4将HTTP消息推送至安防监控视频汇聚EasyCVR平台的操作步骤

TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常…

接口测试和功能测试有什么区别

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…

webpack5零基础入门-8清空前次打包文件与处理图标字体资源

1.配置output中的clean属性为true output: {/**文件输出路径 绝对路径*///__dirname 表示当前文件的文件夹目录path: path.resolve(__dirname, dist),//所有文件的输出目录/**文件名 */filename: static/js/dist.js,//入口文件输出文件名clean: true,//在打包前将path整个目录内…

唯众物联网+地理科学交付云南师范大学地理学部教学实验室项目

近日&#xff0c;云南师范大学地理学部教学实验室建设项目顺利交付。该项目的成功落地&#xff0c;标志着物联网技术与地理科学教育的深度融合&#xff0c;为云南师范大学的地理教学提供了全新的教学平台与资源。该项目以物联网技术为核心&#xff0c;结合地理科学的特点&#…

绝地求生:PUBG 2024年 更新重点偏向于武器平衡、游戏互动及联名道具

一、游戏体验 1. 增加可破坏的环境 1.1 增加更多互动功能 通过可破坏环境将游戏方式变得千变万化。待功能上线&#xff0c;在后续游戏中玩家可以对建筑物进行部分破坏来开辟新的进攻、撤退路线&#xff0c;或搭建掩体进行战略性攻击。 环境破坏部分功能&#xff0c;将会在4…

基于SWOT的智能手机企业财务战略研究1.62

摘 要 近些年&#xff0c;网络技术日新月异&#xff0c;智能手机深受消费者喜爱&#xff0c;人们通过网络&#xff0c;手机应用&#xff0c;可以极大地方便人们学习&#xff0c;工作等等。由于国家对电信行业的大力支持&#xff0c;中国消费者群体逐步成为最具潜力的手机购买者…

中国首个基于区块链的分布式算力网络上线

随着美国人工智能公司OpenAI近期发布的Sora视频模型&#xff0c;全球对高性能算力的需求突破了历史新高。Sora的创新在于它能够以超长生成时间、多角度镜头捕捉&#xff0c;理解物理世界的能力&#xff0c;这不仅是技术的一大突破&#xff0c;更是对算力需求的一大挑战。在这样…

浅易理解:非极大抑制NMS

什么是非极大抑制NMS 非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;简称NMS&#xff09;是一种在计算机视觉和图像处理领域中广泛使用的后处理技术&#xff0c;特别是在目标检测任务中。它的主要目的是解决目标检测过程中出现的重复检测问题&#xff0c;即对于…

《JAVA与模式》之简单工厂模式

系列文章目录 文章目录 系列文章目录前言一、简单工厂模式二、简单工厂模式的优缺点前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在阎宏博士的《JAVA与模式》一…

【Hadoop】Hadoop概述与核心组件

目录 Hadoop概述Hadoop 发展历史Hadoop 三大发行版本1.Apache Hadoop&#xff08;常用&#xff09;2.Cloudera Hadoop3.Hortonworks Hadoop优势优势总结——4高&#xff08;高可靠、高扩展、高效、高容错&#xff09; Hadoop组成1.HDFS管理者&#xff1a;NameNode&#xff08;n…

NCP1271D65R2G中文资料规格书PDF数据手册引脚图参数图片价格功能特性描述

产品描述&#xff1a; NCP1271 是成功的 7 引脚电流模式 NCP12XX 系列的新一代引脚-引脚兼容新产品。该控制器通过使用可调节 Soft Skip 模式和集成的高电压启动 FET&#xff0c;实现了卓越的待机功耗。此专属 Soft Skip 还大大降低了噪音的风险。 因此可以在箝位网络中使用不…

SQLiteC/C++接口详细介绍之sqlite3类(四)

快速跳转文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;三&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;五&#xff09; 编写不易&#xff0c;有用的朋友点个赞或加粉一下万分感…

java Day7 正则表达式|异常

文章目录 1、正则表达式1.1 常用1.2 字符串匹配&#xff0c;提取&#xff0c;分割 2、异常2.1 运行时异常2.2 编译时异常2.3 自定义异常2.3.1 自定义编译时异常2.3.2 自定义运行时异常 1、正则表达式 就是由一些特定的字符组成&#xff0c;完成一个特定的规则 可以用来校验数据…

Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/aac/pcm等

一、前言 用ffmpeg做音视频保存到mp4文件&#xff0c;都会遇到一个问题&#xff0c;尤其是在视频监控行业&#xff0c;就是监控摄像头设置的音频是PCM/G711A/G711U&#xff0c;解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw&#xff0c;将这个原始的音频流保存到mp4文件是会…

使用OpenCV实现两张图像融合在一起

简单介绍 图像融合技术是一种结合多个不同来源或不同传感器捕获的同一场景的图像数据&#xff0c;以生成一幅更全面、更高质量的单一图像的过程。这种技术广泛应用于遥感、医学影像分析、计算机视觉等多个领域。常见的图像融合技术包括基于像素级、特征级和决策级的融合方法&a…

家具工厂5G智能制造数字孪生可视化平台,推进家具行业数字化转型

家具制造5G智能制造工厂数字孪生可视化平台&#xff0c;推进家具行业数字化转型。随着科技的飞速发展&#xff0c;家具制造业正迎来一场前所未有的数字化转型。在这场家具制造业转型中&#xff0c;5G智能制造工厂数字孪生可视化平台发挥着至关重要的作用。 5G智能制造工厂数字孪…

Adobe PDF背景设置护眼模式,缓解眼部疲劳

一、背景 在用Adobe PDF看论文时&#xff0c;默认的白色背景看久了&#xff0c;眼睛会特别疲劳&#xff0c;下面介绍如何设置背景为护眼模式。 二、设置PDF为护眼模式 使用Adobe Acrobat Pro DC打开任意PDF文件&#xff0c;在上方工具栏选择“编辑”&#xff0c;在下拉菜单栏…

如何配置Apache的反向代理

目录 前言 一、反向代理的工作原理 二、Apache反向代理的配置 1. 安装Apache和相关模块 2. 配置反向代理规则 3. 重启Apache服务器 三、常见的使用案例 1. 负载均衡 2. 缓存 3. SSL加密 总结 前言 随着Web应用程序的不断发展和扩展&#xff0c;需要处理大量的请求和…

Vue.js+SpringBoot开发天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…