谈谈MVCC机制

在MySQL中,MVCC(多版本并发控制)是InnoDB存储引擎使用的并发控制机制。它提供对数据的并发访问,并确保多用户环境中数据的一致性和隔离性。

InnoDB通过“Undo log”存储每条记录的多个版本,提供历史记录供读取,并允许不同的事务访问不同的数据版本。在事务期间,客户端只能看到当前事务开始之前提交的记录以及当前事务内所做的修改。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段、undo log日志、readView。

隔离级别

MySQL中有4种隔离级别:

READ UNCOMMITED

当前事务可以读取未提交的数据。这些数据可能会回滚,所以我们将未提交的数据称为脏数据,这种问题称为脏读。

READ COMMITED

当前事务确实可以读取已提交的数据,因此不存在脏读问题。但是,如果当前事务多次读取同一条记录,则可能检索到不同的数据。这是因为,在当前事务期间,可能有其他事务修改并提交了该记录。此问题称为不可重复读。

REPETABLE READ

事务多次读取特定的记录集,即使其他事务在事务过程中修改或提交对这些记录的更改,它也始终会获得这些记录的相同值。但是,如果我们在当前事务中多次执行“SELECT COUNT(*) FROM {table_name}”,我们可能会看到不同的结果,这个问题称为幻读。

REPEATABLE READ 是 MySQL InnoDB 中的默认隔离级别。

SERIALIZABLE

所有事务都强制排序,解决了脏读、不可重复读、幻读等问题。但Serialized隔离级别性能较差,因此在实际中很少使用。

MVCC 仅适用于 READ COMMITTED 和 REPEATABLE READ 隔离级别,因为 READ UNCOMMITTED 始终读取最新记录,而 SERIALIZABLE 会为其读取的所有记录添加锁。

概念

TRANSACTION ID

当一个新的事务开始时,它会得到一个自增的事务ID,通过它InnoDB可以知道每个事务的执行顺序。

隐藏列

InnoDB中的每条记录都有两个隐藏列“db_trx_id”和“db_roll_pointer”,如果表中没有主键或非空唯一键,InnoDB将生成一个隐藏的自增列“db_row_id”。

字段名称描述
db_trx_id记录操作该行的事务的事务id
db_roll_pointerundo指针,指向该行的undo日志

InnoDB 在撤消日志中记录“插入”、“更新”和“删除”操作。然而,对于“删除”操作,InnoDB实际上将其记录为“更新”操作,即通常所说的“软删除”。InnoDB 不是物理删除该行,而是更新“已删除标志”来指示该行已被逻辑删除。此方法允许检索该行的先前版本,如果该行被永久删除,则无法检索先前版本。

当前读

一些 SQL 语句,例如“SELECT * ... LOCK IN SHARE MODE(共享锁)”、“SELECT * ... FOR UPDATE(独占锁)”、“UPDATE”、“DELETE”和“INSERT”, 考虑当前的读取操作。这些操作读取该行的最新版本。在读取过程中,InnoDB通过对当前记录加锁来确保没有其他事务可以修改当前记录。

快照读

没有加锁的 SELECT 语句被视为快照读取操作,通过 MVCC 读取所需的版本。快照读取无锁,有效提升事务性能。

本质上,快照是一种以空间换取时间的方式。

Undo log

Undo log存储修改行的先前版本。在行被修改之前,InnoDB会将当前版本复制到Undo log中,Undo log具有以下功能:

  • 如果事务回滚,InnoDB可以找到以前的版本来恢复。

  • 如果当前版本对于当前事务不可见,则会通过undo log查找可见版本。

前面提到,InnoDB将删除操作记录为更新操作,因此Undo Log中只有两种操作:

  • Insert undo log:由insert操作产生,仅用于事务回滚,事务提交后可立即丢弃。

  • 更新undo log:由更新操作生成,不仅用于事务回滚,还用于快照读取。

版本链

当多个事务同时操作同一条记录时,每个事务都会生成一个新的版本,这些版本通过 db_roll_pointer 形成一个链表,称为版本链。

 

Read View

ReadView是事务执行快照读取时生成的记录快照。

读取视图存储当前事务开始之前的所有活动事务。有 4 个重要属性:

  • trx_ids:活动事务ID(不包括当前事务和已提交事务)。

  • low_limit_id:分配的下一个交易ID。

  • up_limit_id:trx_ids中的最小交易id,如果trx_ids为空,则up_limit_id等于low_limit_id。

  • Creator_trx_id:生成读取视图的事务ID。

以下规则用于检查记录是否对当前事务可见:

  • 如果访问版本的事务ID=creator_trx_id,则表示当前事务访问了自己修改过的记录,则该版本对当前事务可见。

  • 如果访问版本的事务ID < up_limit_id,则说明生成该版本的事务在当前事务生成ReadView之前已经提交,因此该版本可以被当前事务访问。

  • 如果访问版本的事务ID > low_limit_id 值,则说明生成该版本的事务是在当前事务生成ReadView之后打开的,因此当前事务无法访问该版本。

  • 如果访问版本的事务ID在up_limit_id和m_low_limit_id之间,则需要判断该版本的事务ID是否在trx_ids列表中。如果是,说明该版本生成的事务在ReadView创建时仍然处于活动状态,该版本无法访问。

  • 如果没有,说明创建ReadView时生成该版本的事务已经提交,可以访问该版本。

MVCC实现原理

了解了上面的概念后,MVCC的实现就很好理解了。

查询流程

  1. 获取交易自己的交易ID,称为trx_id。(这不是在 SELECT 语句期间获得的,而是在事务开始时获得的,即执行 BEGIN 时获得的。)

  2. 检索 ReadView(仅在 SELECT 语句期间生成)。

  3. 在数据库表中,如果找到数据,则将其与ReadView中的事务版本号进行比较。4、如果不符合ReadView的可见性规则,则需要Undo Log中的历史快照,直到返回符合规则的数据。

InnoDB通过ReadView和Undo Log的结合来实现MVCC。Undo Log 存储历史快照,而 ReadView 的可见性规则有助于确定当前版本数据的可见性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java Web 辅助学习管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 java Web 辅助学习管理系统是一套完善的信息管理系统&#xff0c;结合java 开发技术和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 bootstr…

标准版IP地址证书

IP地址证书是一种网络安全工具&#xff0c;用于确保互联网通信中IP地址的所有权和真实性。它类似于为网站颁发的SSL/TLS证书&#xff0c;但专门针对IP地址。这种证书由受信任的第三方机构&#xff08;如证书颁发机构&#xff09;签发&#xff0c;包含公钥、所有者信息和有效期。…

Python提取PDF中的表格写入Excel

目录 专栏导读库的介绍安装准备测试数据代码1、导入2、加载3、获取表格4、写入Excel完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——>

学习Linux推荐的书籍

我记得有人曾经说过&#xff0c;征服一个男人最好的途径就是抓住他的胃。 ‍‍‍‍ 学习Linux&#xff0c;最重要的就是要先搞懂Linux是啥&#xff0c;有啥&#xff0c;为啥&#xff1f;‍‍‍‍‍‍‍‍‍‍‍‍‍ 所以&#xff0c;我推荐的第一本书就是-《Unix编程艺术》。…

vue 响应式原理 Object.defineProperty(obj,‘属性名A‘,options);

目录 self简单讲解1. 视图影响数据2. 数据影响视图3. 视图数据双向影响页面展示 百度 self 简单讲解 get和set方法是ES5中提供的&#xff0c;因为是方法&#xff0c;所以可以进行判断&#xff0c;get 一般是要通过 return 返回的&#xff1b;而 set 是设置&#xff0c;不用返回…

Nexpose v6.6.244 for Linux Windows - 漏洞扫描

Nexpose v6.6.244 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, Release Mar 27, 2024 请访问原文链接&#xff1a;https://sysin.org/blog/nexpose-6/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.o…

Python抓取京东、淘宝商品数据(属性详情,sku价格抓取)

抓取京东、淘宝等电商平台的商品数据&#xff08;包括属性详情、SKU价格等&#xff09;通常涉及到网络爬虫技术。这些平台都有自己的反爬虫机制&#xff0c;因此抓取数据需要谨慎操作&#xff0c;避免对平台造成不必要的负担或违反其使用条款。 公共参数 名称类型必须描述key…

提升工作效率:B端工作台设计基础详解

随着互联网和信息技术的快速发展&#xff0c;越来越多的企业开始以数字化、智能化的方式管理和运营自己的业务。B端工作台设计作为企业应用的重要组成部分&#xff0c;越来越受到重视。本文将从三个方面对B端工作台设计进行全面分析。让我们看看。 1. B端工作台设计原则 B端工…

Nginx漏洞之未授权访问和源码泄漏漏洞处理

一、漏洞描述 某次安全扫描&#xff0c;发现某平台存在资源&#xff1a;未授权访问和源码泄漏&#xff1b;攻击者可能获取到网站的配置文件、敏感数据存储位置和访问凭证等信息。这意味着攻击者可以获得对网站的完全或部分控制权&#xff0c;进而进行恶意篡改、删除或添加恶意…

交换机MSTP (多生成树防环协议)基础配置

MSTP 基础配置 在所有交换机上创建 VLAN10、20、30、40、50、60、70、80&#xff0c;配置 MSTP 域 hcip&#xff0c;并创建 两个新的实例&#xff1a;Instance 1、Instance 2&#xff0c;将 VLAN10、30、50、70 映射到 Instance 1&#xff0c;将 VLAN20、40、60、80 映射到 Ins…

win11下,RTMP流媒体服务器保姆级教程

本片博客将详细介绍如何搭建一个RTMP流媒体服务器,包含源码下载&#xff0c;编译常见问题解决方法以及流媒体测试&#xff0c;最后讲解了如何利用obs软件实现推流。 服务器&#xff1a;SRS 3.0(Simple Realtime Server&#xff0c;支持RTMP、HTTP-FLV、HLS、WebRTC) 推流端&…

利用甘特图实现精细化项目管控

在项目管理中,通过精细化管控,项目经理能够有效规划、监督和协调各项任务,从而最大限度控制风险,优化资源配置,并确保按时、按质、按量完成项目目标。而在众多项目管理工具中,甘特图无疑是实现精细化项目管控的利器。zz-plan 是一个非常好用的在线甘特图制作工具&#xff0c;一…

Go 源码之互斥锁 Mutex

文章目录 一、总结二、源码&#xff08;一&#xff09;Mutex&#xff08;二&#xff09; Lock&#xff08;三&#xff09;Unlock 三、常见问题有劳各位看官 点赞、关注➕收藏 &#xff0c;你们的支持是我最大的动力&#xff01;&#xff01;&#xff01;接下来会不断更新 golan…

是否有替代U盘,可安全交换的医院文件摆渡方案?

医院内部网络存储着大量的敏感医疗数据&#xff0c;包括患者的个人信息、病历记录、诊断结果等。网络隔离可以有效防止未经授权的访问和数据泄露&#xff0c;确保这些敏感信息的安全。随着法律法规的不断完善&#xff0c;如《网络安全法》、《个人信息保护法》等&#xff0c;医…

计算机网络: 点对点协议 PPP

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

提高三维模型的立面出图技术

提高三维模型的立面出图技术 摘要&#xff1a;立面出图是三维模型应用中常见的需求&#xff0c;它能够将三维模型呈现为平面立面图&#xff0c;用于建筑设计、室内装饰等领域。本文将介绍几种常用的立面出图技术&#xff0c;包括投影法、剖面法和渲染技术&#xff0c;并分析它们…

yolov8逐步分解(1)--默认参数超参配置文件加载

本章节将介绍yolov8算法训练过程中的第一步&#xff1a;加载默认训练参数以及超参的配置文件default.yaml。 Yolov8 训练的入口文件为train.py&#xff0c;文件结构如下图所示&#xff1a; 1. 执行train函数&#xff0c;函数默认配置参数为cfgDEFAULT_CFG &#xff0c…

前端 - 基础 表单标签 - 表单元素 input - (name Value checked maxlength )属性详解

目录 name 属性 Value 属性 Checked 属性 Maxlength 属性 场景问答 # <input> 标签 除了 type 属性外&#xff0c;还有其他常用属性 >>> name 属性 在上一节 我们遇到的 单选按钮 &#xff0c;为什么 本应该 多选一 结果成了 多选多的问题 就…

深度学习_NLP常用库报错问题解决

1、SpaCy can‘t find model ‘zh_core_web_sm‘. It doesn‘t seem to be a python package or a valid path to a data 或者 can‘t find model ‘en_core_web_sm‘. It doesn‘t seem to be a python package or a valid path to a data 安装最新的版本&#xff1a; en_…

卡通纸箱空空如也404源码

源码介绍 卡通纸箱空空如也404源码&#xff0c;喜欢的小伙伴可以下方预览看看&#xff0c;满意之后下载放到任何目录都可以使用&#xff01; 源码下载 卡通纸箱空空如也404源码