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用来解决读写冲突问题,乐观锁或者悲观锁用来解决写和写的冲突。从而最大程度的提高数据库的并发性 。
相关文章:
InnoDB存储引擎非常重要的一个机制--MVCC(多版本并发控制)
Mysql是如何实现隔离性的?(锁MVCC) 隔离性是指一个事务内部的操作以及操作的数据对正在进行的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。隔离性可以防止多个事务并发执行时,可能存在交叉执行导致数据的不…...
【DevOps】服务器硬件基础知识
目录 前言 1、处理器(CPU):服务器的“大脑” 2、内存(RAM):服务器的“工作台” 3、存储(Storage):服务器的“仓库” 4、 网络接口(NIC)&…...
6.10 c语言
7.1 if-else语句 简化形式 if(表达式)语句块 阶梯形式 if(表达式1)语句块1 else if(表达式2)语句块2 嵌套形式 if() if() 语句1 else 语句2 else if() 语句3 else 语句4 表达式一般情况下为逻辑表达式或关系表达式 #include <stdio.h>//从小到大排序,输出顺…...
jenkins插件之Jdepend
JDepend插件是一个为构建生成JDepend报告的插件。 安装插件 JDepend Dashboard -->> 系统管理 -->> 插件管理 -->> Available plugins 搜索 Jdepend, 点击安装构建步骤新增执行shell #执行pdepend if docker exec phpfpm82 /tmp/composer/vendor/bin/pdepe…...
vue3之基于el-image实现图片预览
实现的功能: 图片可放大预览,支持放大、缩小、向左向右旋转查看可点击任意一张图后进行左右切换查看大图 主要使用的方法:splice和concat 主要代码 // template中 <div><el-imagev-for"(item, index) in imgsData":src&q…...
wooyun_2015_110216-Elasticsearch-vulfocus
1.原理 ElasticSearch具有备份数据的功能,用户可以传入一个路径,让其将数据备份到该路径下,且文件名和后缀都可控。 所以,如果同文件系统下还跑着其他服务,如Tomcat、PHP等,我们可以利用ElasticSearch的备…...
Fedora的远程桌面
要在 Fedora 40 上开启远程桌面功能。 首先,要确保已安装 gnome-remote-desktop 和 vino 包。 这些软件包通常默认安装在 Fedora 的 GNOME 桌面环境中。 可以按照以下步骤操作: 1、判断电脑是否安装了 gnome-remote-desktop 和 vino 包: tomfedora:…...
CSS id选择器
目录 任务描述 相关知识 id选择器 id选择器语法 类选择器与id选择器的区别 编程要求 任务描述 在本关中,你将通过id选择器的方式完成页面菜单栏样式布局,栏目导航等任务。 完成任务之后,基本页面效果如下: 动态效果如下&am…...
22.搭积木
上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/717 题目描述 小爱用积木搭起一座金字塔。为…...
手机投屏到电脑时,手机提示连接失败
前言 注意,本方法建立在你已经通过其他帖子等解决了前置条件的情况下,手机提示连接失败情况下,包括但不限于关闭防火墙、安装无线投屏工具、手机和电脑连接在同一个WiFi频段下、关闭杀毒软件等。 具体操作方法 1、请进入设置 > 系统和…...
软件测试--Mysql快速入门
文章目录 软件测试-mysql快速入门sql主要划分mysql常用的数据类型sql基本操作常用字段的约束:连接查询mysql内置函数存储过程视图事务索引 软件测试-mysql快速入门 sql主要划分 sql语言主要分为: DQL:数据查询语言,用于对数据进…...
什么是PV操作
PV操作是一种在操作系统中用于同步和互斥的机制,它基于信号量(Semaphore)的概念。在并发编程中,多个进程或线程可能会同时访问共享资源,PV操作可以用来确保这些访问是同步的,以防止竞态条件和数据不一致的问题。 PV操作包括两个原子操作: P操作(Proberen,测试):这…...
差动放大器
差动器的出现是为了解决直接耦合电路存在的零点漂移问题,另外,差动放大器还有灵活的输入,输出方式。 一,基本差动放大器 差动放大器在电路结构上具有对称性,三极管VT1,VT2同型号,R1R2,R3R4,R5…...
【数据结构与算法 经典例题】括号匹配问题
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法 经典例题》C语言 期待您的关注 目录 一、问题描述 二、解题思路 🍃破解之道 🍃…...
2024年6月最新开源电视影视TVAPP原生源码和后台管理平台源码及完整教程
本套源码为本人维护更新完善半年左右的还在使用开发的源码,与市面上倒卖的残次品不一样,没有可比性,向下兼容安卓4.0,向上兼容安卓13以上TV电视系统, 完全无闪退,弹窗报错,卡死、异常死循环残次…...
[大模型]GLM4-9B-chat Lora 微调
本节我们简要介绍如何基于 transformers、peft 等框架,对 LLaMA3-8B-Instruct 模型进行 Lora 微调。Lora 是一种高效微调方法,深入了解其原理可参见博客:知乎|深入浅出 Lora。 这个教程会在同目录下给大家提供一个 nodebook 文件,…...
目标检测算法YOLOv9简介
YOLOv9由Chien-Yao Wang等人于2024年提出,论文名为:《YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information》,论文见:https://arxiv.org/pdf/2402.13616 ;源码见: https://github.com/W…...
达梦数据库搭建守护集群
前言 DM 数据守护(Data Watch)是一种集成化的高可用、高性能数据库解决方案,是数据库异地容灾的首选方案。通过部署 DM 数据守护,可以在硬件故障(如磁盘损坏)、自然灾害(地震、火灾)…...
OpenGL-ES 学习(6)---- Ubuntu OES 环境搭建
OpenGL-ES Ubuntu 环境搭建 此的方法在 ubuntu 和 deepin 上验证都可以成功搭建 目录 OpenGL-ES Ubuntu 环境搭建软件包安装第一个三角形基于 glfw 实现基于 X11 实现 软件包安装 sudo apt install libx11-dev sudo apt install libglfw3 libglfw3-dev sudo apt-get install…...
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
文章目录 前言一、项目初始化搭建1、创建项目:test_models_django2、创建应用app01 二、配置mysql三、创建model实例,自动创建数据库表1、创建对象User类2、执行命令 四、思考问题(****)1、是否会生成新表呢(答案报错&…...
对象创建的4种模式
1. 工厂模式 这种模式抽象了创建具体对象的过程,用函数来封装以特定接口创建对象的细节 缺点:没有解决对象识别的问题(即怎样知道一个对象的类型) function createPerson(name, age, job) {var o new Object();o.name name;o.ag…...
如何判断 是否 需要 CSS 中的媒体查询
以下是一些常见的使用媒体查询的场景: 响应式布局:当设备的屏幕尺寸变化时,我们可以使用媒体查询来调整布局,以适应不同的屏幕尺寸。 设备特性适配:我们可以使用媒体查询来检测设备的特性,如设备方向、分辨…...
设计模式-装饰器模式(结构型)
装饰器模式 装饰器模式是一种结构模式,通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能,是现有类的包装。 图解 角色 抽象组件:定义组件的抽象方法具体组件:实现组件的抽象方法抽象装饰器:实现…...
升级HarmonyOS 4.2,开启健康生活篇章
夏日来临,华为智能手表携 HarmonyOS 4.2 版本邀您体验,它不仅可以作为时尚单品搭配夏日绚丽服饰,还能充当你的健康管家,从而更了解自己的身体,开启智能健康生活篇章。 高血糖风险评估优化,健康监测更精准 …...
给gRPC增加负载均衡功能
在现代的分布式系统中,负载均衡是确保服务高可用性和性能的关键技术之一。而gRPC作为一种高性能的RPC框架,自然也支持负载均衡功能。本文将探讨如何为gRPC服务增加负载均衡功能,从而提高系统的性能和可扩展性。 什么是负载均衡? …...
【优选算法】详解target类求和问题(附总结)
目录 1.两数求和 题目: 算法思路: 代码: 2.!!!三数之和 题目 算法思路: 代码: 3.四数字和 题目: 算法思路: 代码: 总结&易错点&…...
【数据结构】图论入门
引入 数据的逻辑结构: 集合:数据元素间除“同属于一个集合”外,无其他关系线性结构:一个对一个,例如:线性表、栈、队列树形结构:一个对多个,例如:树图形结构࿱…...
11_1 Linux NFS服务与触发挂载autofs
11_1 Linux NFS服务与触发挂载服务 文章目录 11_1 Linux NFS服务与触发挂载服务[toc]1. NFS服务基础1.1 示例 2. 触发挂载autofs2.1 触发挂载基础2.2 触发挂载进阶autofs与NFS 文件共享服务:scp、FTP、web(httpd)、NFS 1. NFS服务基础 Netwo…...
开发uniapp 小程序时遇到的问题
1、【微信开发者工具报错】routeDone with a webviewId XXX that is not the current page 解决方案: 在app.json 中添加 “lazyCodeLoading”: “requiredComponents” uniapp的话加到manifest.json下的mp-weixin 外部链接文章:解决方案文章1 解决方案文章2 &qu…...
怎样快速获取Vmware VCP 证书,线上考试,voucher报名优惠
之前考一个VCP证书,要花大一万的费用,可贵了,考试费不贵,贵就贵在培训费,要拿到证书,必须交培训费,即使vmware你玩的很溜,不需要再培训了,但是一笔贵到肉疼的培训费你得拿…...
wordpress中文版源码/seo咨询解决方案
目录 EFK架构(elasticsearch\filebeat\kibana) 1、下载elasticsearch、kibana、filebeat 2、创建用户并授权 3、安装并启动 3.1 使用elasticsearch账号安装启动 >3.1.1 解压 elasticsearch >3.1.2 配置 elasticsearch >3.1.3 启动elast…...
属于b2b电子商务模式的平台有/seo排名优化seo
导读:什么样的区域对人才最具吸引力?广东海丝研究院推出的《广州11区人才吸引力指数报告》显示,广州11区中,天河区人才吸引力指数优势明显,位列第一,黄埔区、白云区、越秀区、南沙区紧随其后,海…...
wordpress 秀米/深圳seo公司排名
首先我们打开引擎,引擎窗口——文件——新建——55ide客户端——新建一个工程 一般新建在引擎根目录下面的,游戏作品里面。当然,你要放到其他位置,也可以,谁叫你这么叼 这就是进入主程序的界面。 加载:初始…...
广州站是不是广州火车站/系统推广公司
根据云安全联盟的年度调查显示,虽然企业及其员工正在越来越多的使用云计算服务,但企业高管仍然担心业务数据存储在云计算中所涉及的安全隐患。 这个“云部署做法和重点调查报告”发现,74%的企业计划在今年部署云计算服务,但只有8%的企业认为他们知道其员工正在使用什么应用程序…...
网站建设预算表样本/外贸推广是做什么的
iredmail配置好后,尝试从一客户端的OE中发送邮件,结果报错,在mail主机中查看tail /var/log/maillog,发现如下错误信息:Oct 24 12:50:49 mail2 postfix/smtpd[9280]: connect from unknown[192.168.5.240] Oct 24 12:50…...
织梦cms 做视频网站/深圳产品网络推广
项目引入vue-i18n实现国际化多语言,vue-i18n包 自行下载,放到libs目录下,在main.js中引入 //main.js import Vue from vue import App from ./App //多语言引入 import VueI18n from ./libs/vue-i18n import en from ./common/js/en.js//英文…...