InnoDB存储引擎非常重要的一个机制--MVCC(多版本并发控制)

Mysql是如何实现隔离性的?(锁+MVCC)

隔离性是指一个事务内部的操作以及操作的数据对正在进行的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。隔离性可以防止多个事务并发执行时,可能存在交叉执行导致数据的不一致。

MySQL 对隔离性的保证主要有两个方面:

--用锁机制来保证一个事务写操作对另一个事务写操作的隔离性,

---用 MVCC 机制来保证一个事务写操作对另一个事务读操作的隔离性。

MySQL 中按照锁的粒度,可以分为全局锁,表锁和行锁。

全局锁会使整个数据库处于只读状态,在做全库逻辑备份时经常用到。表级锁在操作数据时会锁定整张表,并发性能一般,而行锁可以做到只锁定需要操作的记录行,并发性能很好。但是由于加锁本身需要消耗资源,因此某些在锁定数据较多的情况下可以使用表锁来减少开销。

MVCC 主要解决的是读写冲突的问题它是由 undo log + read view 实现的。其中 undo log 可以为每条记录保存多个历史版本,MySQL 在执行快照读的时候,会根据事务的 read view 里的信息,顺着 undo log 的版本链找到满足可见性的记录。

MVCC-Multi-Version Concurrency Control 多版本并发控制

是指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐藏字段、undo log日志、readView。

数据库记录中的三个(两个)隐藏字段:

 undo log日志:

多个事务 提交事务之后undo log不会立即删除.原因是有活动的事务,正在用到这个undo log,结合ReadView..

undo log版本链: 

  • 在不同事务/相同事务对同一记录进行修改,修改过程中会记录 该记录的undo log日志。
  • 会导致该记录的uodo log生成一条记录版本链表。链表的头部是最新的旧记录,尾部是最早的旧记录!
  • undo log日志中记录了当前记录(行数据)的历史版本。

查询时应该返回哪一个版本呢??
具体返回哪个版本,要取决于MVCC实现原理中的readview

ReadView(读视图)

ReadView 是 快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

 版本链数据访问规则:

 不同的隔离级别,生成ReadView的时机不同:
- RC: 在事务每次快照读的时候,都会产生一个新的ReadView....(里面维护着当前活动的事务ID)
- RR: 在事务第一次快照读的时候,会产生一个新的ReadView,后续的每次快照读都会复用第一个ReadView..(里面维护着当前活动的事务ID)

(这是造成 不可重复读 和 幻读的本质原因)

RC隔离级别下:

每次快照读的时候,会从当前记录的最新版本开始,和ReadView中的字段,通过版本链数据访问规则开始对比。如果符合就返回当前 版本记录,如果不符合,就按照版本链的链表往下继续做对比,直到找到符合规则的那个版本返回。。

因为RC(读已提交)隔离级别下每次快照读都是新的ReadView,所以维护的活动事务ID集合m_ids都可能不一样,所以会有不可重复读的现象出现!(问题根源)

比如上图:一次快照读是{3,4,5},一次快照读是{4,5}

RR隔离级别下:

第一次快照读,会产生一个ReadView,分别记录四个属性,接下来第二个快照读的时候,不会再生成一个ReadView了 ,直接复用第一个,所以匹配规则也都 一样,在undo log版本链中查找时查出来的数据 也都一样,这就保证了 可重复读!

所以:MVCC-- 它的主要作用就是在 快照读 的时候,决定我们提取的到底是哪一个版本

总结:

扩展:

1、当前读

当前读就是读取到的是最新的数据!通过select .. lock in share mode(共享锁)实现,或通过select ...for update、update、insert、delete(排它锁)等实现!

 2、快照读

3、在InnoDB存储引擎下的RR隔离级别下:

  • 快照读会使用MVCC. (select * ... 普通sql语句)
  • 当前读会采用Next-Key-Lock,是行锁 + 间隙锁的方式来处理(锁机制).  (select ..lock in share mode/for ..update  update  insert delete)  

4、 RR级别下 快照读 使用了MVCC一定能避免幻读吗?
- 能,但不完全能!
- 因为MVCC并不是采用锁的方式完全的对事务数据进行了隔离,而是通过版本控制变相的实现了解决幻读的功能

特例:当两次快照读之间存在当前读,ReadView会重新生成,会导致产生幻读。

 MVCC在快照读的情况下可以解决幻读问题,但是在当前读的情况下是不能解决幻读的

5、RR可重复读隔离下为什么会产生幻读?

在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的(因为复用同一个 ReadView)。因此,幻读在 当前读 下才会出现。

SELECT * FROM player LOCK IN SHARE MODE;
SELECT * FROM player FOR UPDATE;
INSERT INTO player values ...
DELETE FROM player WHERE ...
UPDATE player SET ...

6、什么是幻读
在可重复读的数据隔离级别下,在同一个事务中,使用当前读,读到了其他事务新插入的数据的现象叫做幻读。这里有几个定语:可重复读的事务隔离级别,当前读,插入的新数据。只有在这些定语的约束下​才能形成幻读。​

我们知道可重复读的数据隔离级别下,一个事务无法查询到另外一个事务对数据表进行的变更,不过,这个结论的前提是,这个查询是一个普通查询,也就是快照读,如果查询的方式是当前读(select * from table for update),那么就可以查询到另外一个事务的变更结果的。但是"幻读"的定义,对"变更"又做了更严格的限制,幻读,只仅仅针对 "insert" 的变更,而对 "update" 的变更,虽然查询也可以感知到,但这不会被称为幻读。虽然这里说的有点啰嗦,但是幻读的定义就是那么严格,所以我要多强调一遍。

我们在使用MVCC的时候,一般是根据业务场景选择组合搭配,乐观锁或悲观锁。

MVCC用来解决读写冲突问题,乐观锁或者悲观锁用来解决写和写的冲突。从而最大程度的提高数据库的并发性 。

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

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

相关文章

安全U盘和普通U盘有什么区别?

安全U盘(也称为加密U盘或安全闪存驱动器)与普通U盘肯定是有一些区别的,从字面意思上来看,就能看出,安全U盘是能够保护文件数据安全性的,普通U盘没这一些功能的,可随意拷贝文件,不防盗…

面试4:c++(数位物联)

1.const 关健字的作用 定义常量,防止变量被意外修改,增强程序的可读性和维护性。 可以用于指针,声明指向常量的指针或常量指针。 2.static关健字的作用 (1)在函数内,用于修饰局部变量,使其生命周期延长到整个程序运行期…

mybatisplus多数据源内置方法报Invalid bound statement (not found)

在用mybatis-plus多数据源时用mapper内置的 selectList(queryWrapper) 查询数据报org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 问题是在配置多数据源时用的是SqlSessionFactoryBean,改为MybatisSqlSessionFactoryBean即可…

Python怎么逐行处理文件:深度解析与实用技巧

Python怎么逐行处理文件:深度解析与实用技巧 在Python中,逐行处理文件是一项常见且重要的任务。无论是读取大型日志文件、分析文本数据还是处理配置文件,逐行读取都能帮助我们更有效地管理内存并提高处理速度。本文将详细介绍Python中逐行处…

一文了解UVLED线光源的应用

在机器视觉系统中,光源作为不可或缺的一部分,能够提高目标成像效果,增强检测效果。光源的选择至关重要,选到不合适的会影响成像及检测效果。针对不同的检测对象,不同的形状光源应运而生。我们来看看最UVLED线光源。 下面以CCS的光…

某红书旋转滑块验证码分析与协议算法实现

文章目录 1. 写在前面2. 接口分析3. 验证轨迹4. 算法还原【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作! 【🌟作者推…

zoomeye api报错 request invalid, validate usage and try again

项目场景: 调用zoomeye的api接口进行数据拿取 问题描述 之前接口一直通着今天突然报错,以下为源代码 pip install zoomeye from zoomeye.sdk import ZoomEye zm ZoomEye(api_key"34A8B452-D874-C63E0-8471-F3D4f89766f") zm.dork_search(a…

图片像素缩放,支持个性化自定义与精准比例调整,让图像处理更轻松便捷!

图片已经成为我们生活中不可或缺的一部分。无论是社交媒体的分享,还是工作文档的编辑,图片都扮演着至关重要的角色。然而,你是否曾经遇到过这样的问题:一张高清大图在上传时却受限于平台的大小要求,或者一张小图需要放…

Spring MVC 源码分析之 DispatcherServlet#processDispatchResult方法

前言: 前面的篇章我们分析了 Spring MVC 工作流程中的 HandlerMapping、HandlerAdapter 的适配过程、拦截器的工作流程,以及处理业务请求的过程,本篇我们分析一下处理完业务解析视图的方法,也就是 DispatcherServlet#processDisp…

提高篇(二):高级绘图技巧:在Processing中创造精美图形

提高篇(二):高级绘图技巧:在Processing中创造精美图形 引言 Processing不仅是一种编程语言,更是一个用于创意编程的强大工具。掌握高级绘图技巧,可以让你在艺术创作中如虎添翼。在本篇文章中,我们将探索贝塞尔曲线、样条曲线、自定义形状、图形变换等高级绘图技术,帮助…

tkinter+火山引擎+python实现语音识别聊天机器人

想要做一款能通过语音识别来聊天的智能机器人,首先需要能通过麦克风录制语音进行识别转换成文字,将文字发送给机器人得到聊天结果,并能将返回的文字转换成语音进行合成,之后再通过本地播放语音实现语音交互。 架构: 实现步骤 一、本地录音 本地录音可以通过pyAudio库实…

2024-06-05-记一次cnvd渗透

前言:挖src挖郁闷了,闲来无事选择挖一个cnvd来练练手,本次的漏洞都没啥难度,企查查资产过了5000万 说一下cnvd证书的下放标准 对于中危及中危以上通用型漏洞(CVSS2.0基准评分超过4.0分),以及涉…

Scaling vision Transformer 论文理解

Scaling vision Transformer 论文理解 1. 摘要2. 一些主要结论小结2.1 few shot transfer learning2.2 Pareto-front3. 讨论3.1 Limitations3.2 社会作用4. 文章结论参考资料1. 摘要 Attention-based neural networks such as the Vision Transformer (ViT) have recently att…

valgrind-内存泄漏定位工具

1、前言 valgirnd 是一套开放源代码的动态调试工具集合。能够检测内存管理错误,线程BUG等。valgirnd是由内核以及基于内核的其他调试工具组成。内核类似于一个框架,它模拟了一个cpu的环境,并提供服务给其他工具使用。而其他工具则类似于插件…

红酒:红酒保存中的光照与避免阳光直射

在红酒保存中,光照是一个常常被忽视的因素。光照对红酒的影响是不可小觑的,因为阳光中的紫外线会加速红酒的氧化,导致其口感和品质的下降。因此,在保存云仓酒庄雷盛红酒时,应特别注意避免阳光直射。 阳光直射对红酒的影…

企业代码签名证书1300元

随着手机和电脑等设备的普及,越来越多的开发者进入软件行业,为了软件的安全性、完整性和可信度,开发者往往会使用由正规CA认证机构颁发的代码签名证书对软件代码进行数字签名,来标识软件的来源和软件开发者的真实身份。今天就随SS…

AGI时代下,计算机专业出身的程序员该何去何从?

Easy:单独开个贴说一下吧。 如果你计算机、软件工程、通信、电子、网络等相关专业本科毕业,也考虑前后端/测试岗,戳 技术大厂,6险1金,待遇不错。 提前说明,一切以古代思维对AGI时代的推演,都是可…

博物馆文物库房管理软件

博物馆作为文化遗产的守护者和传承者,承载着人类智慧与文明的结晶。在博物馆的背后,一个庞大而严密的管理系统支撑着文物的保护与展示。而其中,文物库房管理软件的使用,无疑是一项重要的管理工具。 文物库房管理软件的功能具有多样…

【CentOS 7】挑战探索:在CentOS 7上实现Python 3.9的完美部署指南

【CentOS 7】挑战探索:在CentOS 7上实现Python 3.9的完美部署指南 大家好 我是寸铁👊 总结了一篇【CentOS 7】挑战探索:在CentOS 7上实现Python 3.9的完美部署指南详细步骤✨ 喜欢的小伙伴可以点点关注 💝 前言 此篇教程只适用于p…

【java前端课堂】05_类的多态

类的多态是面向对象编程的三大特性之一,与封装和继承并列。多态性允许我们将父对象设置为与其子对象相等的技术,让我们可以把一个子对象当作父对象对待。在Java中,多态主要体现在以下三个方面: 方法的重载(Overloadin…