白话-MVCC如何工作

MySQL中的MVCC机制主要在以下情况下起作用:

  1. 使用支持MVCC的存储引擎:MVCC主要是MySQL的InnoDB存储引擎中实现并发控制的一种方式,只有当使用InnoDB作为表的存储引擎时,MVCC机制才会生效。

  2. 非串行化事务隔离级别:MVCC在“读已提交(Read Committed)”和“可重复读(Repeatable Read)”这两种事务隔离级别下发挥作用。在“读未提交(Read Uncommitted)”隔离级别下,虽然也可能看到不同事务版本的数据,但这并非严格意义上的MVCC;而在“串行化(Serializable)”隔离级别下,为了保证事务之间的完全隔离,通常会放弃MVCC机制而采用更严格的锁策略。

    • 读已提交(Read Committed):每个查询语句执行前都会获取最新的数据快照,因此同一个事务内前后两次相同的查询可能返回不同的结果。

    • 可重复读(Repeatable Read):这是MySQL的默认事务隔离级别,在这个级别下,事务开始时会获取一个数据快照,并在整个事务期间都基于该快照进行读取操作,这样可以确保事务内的多次相同查询始终得到一致的结果。

  3. 非锁定读操作:MVCC主要针对的是不加锁的SELECT查询,即所谓的“快照读”。对于“当前读”操作,如SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE以及INSERT、UPDATE、DELETE等写操作,通常不会通过MVCC来提供数据的一致性视图,而是直接应用行级锁或者间隙锁来避免并发问题。

在多个事务共同操作相同数据行时,MVCC(多版本并发控制)机制能够确保事务间的并发访问不会相互阻塞,同时保持事务的隔离性。以下是一个简化的描述:

假设我们有两个事务A和B,它们都在操作同一行数据row1。 

事务A的操作流程:
  • 事务A开始并获取一个事务ID(Transaction ID, trx_id)。
  • 事务A执行查询操作读取row1的数据。InnoDB存储引擎会根据事务A的视图(即当前已提交事务的快照)查找row1对应的时间戳或事务ID来决定哪些版本的数据对事务A可见。
  • 如果事务A需要更新row1,它并不直接覆盖原有数据,而是创建一个新的数据版本,并将这个版本标记为属于事务A的未提交状态。同时,旧版本的数据并不会立即删除,而是保留下来以供其他事务可能需要查看的历史版本。
  • 在事务A提交前,所有对row1的更改只对事务A自身可见;其他事务在此期间读取row1时,看到的是事务A开始之前已经提交的版本。
事务B的操作流程:
  • 同样,事务B开始并获取自己的事务ID。
  • 当事务B尝试读取row1时,它也会基于自己的事务视图去寻找合适的数据版本。
  • 如果事务B是在事务A提交之后开始读取row1,那么它将会看到事务A的最新提交版本(如果事务A已经提交了对row1的更改)。
  • 如果事务B尝试修改row1,即使在事务A还未提交的情况下,由于MVCC的存在,它同样可以进行无冲突的修改,生成新的版本。

通过这种方式,两个事务可以在不互相等待对方释放锁的情况下,独立地进行读写操作。当事务提交后,系统会清理不再需要的旧版本记录,以保证空间的有效利用。

总的来说,在MVCC中,每个事务都像是在操作自己特定版本的数据集,从而避免了传统锁定机制带来的潜在阻塞问题,提高了数据库系统的并发性能。

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

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

相关文章

一文掌握mysql中的查询语句

目录 1. 聚合查询1.1 聚合函数1.2 GROUP BY子句1.3 HAVING 2. 联合查询2.1 内连接2.2 外连接2.3 自连接2.4 子查询2.5 合并查询 1. 聚合查询 1.1 聚合函数 常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有: 函…

读书笔记:<<上瘾>>

上瘾的四个步骤: 第一个叫触发, 第二个叫行动 第三个叫多变的酬赏, 第四个叫投入 我们首先一定会提升用户的终身价值。一个用户用一次还是用一辈子,价值是完全不一样的。 第二个就是你能够获得这个完全不同的灵活收益。比如说像我们刚刚说的…

【构建部署_Docker介绍与安装】

构建部署_Docker介绍与安装 构建部署_Docker介绍与安装Docker介绍Docker安装CentOS安装DockerCompose 构建部署_Docker介绍与安装 Docker介绍 Docker 是一个基于go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#x…

基于MPC模型的自动驾驶控制总结---参考学习链接以及常规知识--simulink mpc和adapter mpc的关系和区别

1,mpc 2,adapter mpc 3,参考链接: 微信文章:简析MPC及其实践(二)simulink实践 MPC模型预测控制(6)–MPC与无人驾驶轨迹跟踪,以及mpc和adapter mpc的区别

QT 如何防止 QTextEdit 自动滚动到最下方

在往QTextEdit里面append字符串时,如果超出其高度,默认会自动滚动到QTextEdit最下方。但是有些场景可能想从文本最开始的地方展示,那么就需要禁止自动滚动。 我们可以在append之后,添加如下代码: //设置编辑框的光标位…

Java_9最大连续1的个数

最大连续1的个数 给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3. 示例 2: 输入…

NBlog整合OSS图库

NBlog部署维护流程记录(持续更新):https://blog.csdn.net/qq_43349112/article/details/136129806 由于项目是fork的,所以我本身并不清楚哪里使用了图床,因此下面就是我熟悉项目期间边做边调整的。 目前已经调整的功能…

CVE-2019-5782:kArgumentsLengthType 设置偏小导致优化阶段可以错误的去除 CheckBound 节点

文章目录 环境搭建漏洞分析笔者初分析笔者再分析漏洞触发源码分析 漏洞利用总结 环境搭建 sudo apt install pythongit reset --hard b474b3102bd4a95eafcdb68e0e44656046132bc9 export DEPOT_TOOLS_UPDATE0 gclient sync -D// debug version tools/dev/v8gen.py x64.debug ni…

FreeRTOS操作系统学习——软件定时器

软件定时器介绍 软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期,简而言之,当定时器的定时周期到了以后就…

C语言--字符串面试题

字符串是由若干字符组成的序列。由于字符串在编程时使用的频率非常高,为了优化,很多语言都对字符串做了特殊的规定。下面分别讨论C/C字符串的特性。 C/C中每个字符串都以字符"0作为结尾,这样我们就能很方便地找到字符串的最后尾部。但由于这个特点,每个字符串中…

Android 15 首个开发者预览版到来

作者 / 工程副总裁 Dave Burke Android 15 的首个开发者预览版现已发布,以便各位开发者能与我们通力协作,打造更优秀的 Android 平台。 在 Android 15 中,我们继续致力于打造一个既能提升工作效率,又能提供全新功能的平台。这些新…

【Java - 框架 - Mybatis】(02) SpringBoot整合Mybatis操作Mysql - 快速上手

“SpringBoot"整合"Mybatis"操作"Mysql” - 快速上手; 环境 Java版本"1.8.0_202";Spring Boot版本"2.5.9";Windows 11 专业版_22621.2428;IntelliJ IDEA 2021.1.3(Ultimate Edition)&a…

Java基础面试题整理2024/3/13

1、可以使用switch的数据类型 Java5以前,switch(arg)表达式中,arg只能是byte、short、char、int。 Java5之后引入了枚举类型,也可以是枚举类型。 Java7开始引入了字符串类型。 2、Java中的goto有什么作用 goto是Java中的保留字&#xff0c…

【Rust】——枚举与模式匹配

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

2.案例、鼠标时间类型、事件对象参数

案例 注册事件 <!-- //disabled默认情况用户不能点击 --><input type"button" value"我已阅读用户协议(5)" disabled><script>// 分析&#xff1a;// 1.修改标签中的文字内容// 2.定时器// 3.修改标签的disabled属性// 4.清除定时器// …

Day15 面向对象进阶——接Day14

Day15 面向对象进阶——接Day14 文章目录 Day15 面向对象进阶——接Day14一、访问修饰符二、Object三、深入String的equals()方法四、final 一、访问修饰符 1、含义&#xff1a;修饰类、方法、属性&#xff0c;定义使用的范围 2、经验&#xff1a; 2.1.属性一般使用private修…

JavaScript进阶:js的一些学习笔记

文章目录 1. js作用域2. 函数3. 解构赋值 1. js作用域 作用域规定了变量能够呗访问的范围&#xff0c;离开这个范围&#xff0c;这个变量就不能够被访问到。 局部作用域&#xff1a;可以分为函数作用域和块作用域 块作用域&#xff0c;let 声明会产生块级作用域&#xff0c;va…

武汉星起航:秉承客户至上服务理念,为创业者打造坚实后盾

在跨境电商的激荡浪潮中&#xff0c;武汉星起航电子商务有限公司一直秉持着以客户为中心的发展理念&#xff0c;为跨境创业者提供了独特的支持和经验积累&#xff0c;公司通过多年的探索和实践&#xff0c;成功塑造了一个以卖家需求为导向的服务平台&#xff0c;为每一位创业者…

window python开发环境搭建- Anaconda

window python开发环境搭建- Anaconda 下载Anacnoda配置Anconda验证Anaconda是否安装成功验证 conda 是否安装成功验证 pip 是否安装成功验证 python 是否安装成功 配置镜像源conda 镜像源pip 镜像源 pip 常用命令conda 常用命令 下载Anacnoda anacoda官网地址 https://www.an…

hive库表占用空间大小的命令

1、查每个hive表占用的空间大小 hdfs dfs -du -h /user/hive/warehouse 2、按占用空间大小降序排列 hdfs dfs -du /user/hive/warehouse/ipms.db | sort -nr 3、查某一个分区占用空间大小&#xff08;单位G) hadoop fs -ls /user/hive/warehouse/ipms.db/dw_ft_se_nt_u_gen…