MySQL:MVCC原理详解

        MySQL是允许多用户同时操作数据库的,那么就会出现多个事务的并发场景。那么再并发场景会出现很多问题:脏读、不可重复读、幻读的问题。

而解决这些问题所用到的方法就是:MVCC 多版本并发控制。而这个MVCC的实现是基于read_view、undoLog

如果不了解这几种问题的概念可以看这两篇博客:

MySQL:事务隔离级别详解,MySQL:三大日志(binlog、redo log、undo log)

1、 reda_view

        read view是一个数据库的内部快照,它记录了数据库在某个时刻的数据信息。read view用于实现事务的隔离性,即在并发事务中,一个事务能看到哪些数据,以及哪些数据对其他事务不可见。read view的生成时机和事务的隔离级别有关,例如,在可重复读隔离级别下,read view会在事务开始时生成,而在读已提交隔离级别下,read view会在每条查询语句执行时生成。

除了记录着数据之外,它还记录着几个变量来辅助我们来判定可见性。

  • min_trx_id:在生成Read View时,当前系统中活跃的读写事务中最小的事务ID,即m_ids中的最小值;
  • max_trx_id:最后开始的事务,该SQL启动时,当前事务链表中最大的事务id编号,也就是最近创建的除自身以外最大事务编号。
  • m_ids:在生成Read View时,当前系统中活跃的读写事务的事务ID列表;
  • creator_trx_id:在生成Read View时,当前事务的事务ID。

 reda_view的判断规则:

  • 如果事务id小于min_trx_id,表示该事务在read view生成之前已经提交,所以对当前事务可见。
  • 如果事务id大于max_trx_id,表示该事务在read view生成之后才开始,所以对当前事务不可见。
  • 如果事务id在min_trx_id和max_trx_id之间,那么需要查看该事务id是否在m_ids中。如果在,表示该事务在read view生成时仍在活跃,所以对当前事务不可见;如果不在,表示该事务在read view生成之前已经提交,所以对当前事务可见。

2、undo log

        MVCC中判断可见性判断的就是下面这个undo log的版本链,假设要查询id为1的记录的姓名,此次事务id(trx_id)为63,那么版本链第一个看到事务id为66,假设此时创建的reda_view中的max_trx_id为65,那就说明名字为小吴的是再此次查询创建reda_view后才进行的修改,所以对此次的查询事务不可见。所以查询出来的应该是小王。

3、MVCC实现 可重复读 和 读已提交

上图再没有使用MVCC版本控制的时候,会出现上面这种问题,再一个事务中读取两次得到的结果不想同,这个就是不可重复读的问题,那么MVCC是只会再第一次查询语句时生成read_View快照,

  1. 事务A第一次查询查出来很正常是“小王”,
  2. 再第二次查询前事务B提交,将小王改为小吴。
  3. 然后事务A进行第二次查询,根据第一次查询时生成的read_View中,根本没有这条记录,则此条记录对A来说是不可见的,所以查询出来的还是小王。

如果是读已提交的隔离级别,则是每执行一次查询语句都会生成reda _View,这样也就能再第二次读的时候生成新的read_View ,然后看到版本链中改成小吴的这条undo log日志了。然后进行可见性判断,此时事务Bid>事务Aid,但又不在活跃事务列表中。说明生成此次快照时,事务B已经提交了,所以条记录对于事务A来说是可见的。

4、幻读的解决

  • 针对快照读(普通 select 语句),可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。
  • 针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select ... for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。

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

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

相关文章

Linux部署lomp环境,安装typecho、WordPress博客

部署lomp环境,安装typecho、WordPress博客 一、环境要求1.1.版本信息1.2.准备阿里云服务器【新用户免费使用三个月】1.3.准备远程工具【FinalShell】 二、Linux下安装openresty三、Linux下安装Mysql四、安装Apache【此步骤可省略】4.1.安装Apache服务及其扩展包4.2.…

《HTML 简易速速上手小册》第9章:HTML5 新特性(2024 最新版)

文章目录 9.1 HTML5 新增标签和属性9.1.1 基础知识9.1.2 案例 1:创建一个结构化的博客页面9.1.3 案例 2:使用新的表单元素创建事件注册表单9.1.4 案例 3:创建一个具有高级搜索功能的搜索表单 9.2 HTML5 表单增强9.2.1 基础知识9.2.2 案例 1&a…

制冷机组主要组成元件和功能

组主要组成元件的功能如下: 1) 压缩机:主要起吸排气作用,将蒸发后的制冷剂气体吸入压缩机并进行压缩,再排到油分离中; 2) 减震管:可有效地防止压缩机的震动传递到管路部分; 3&am…

自然语言处理(NLP)技术使用

自然语言处理(NLP)技术使用 以下是一些自然语言处理(NLP)技术的例子:以上只是一些NLP技术的例子,还有许多其他的技术和应用,如文本分类、文本生成、问答系统等。NLP技术的发展正逐渐改变人们与计…

c#窗体捕捉方向键

方法1 实现方法参考代码: private void Form1_Load(object sender, EventArgs e){this.KeyPreview true;}protected override bool ProcessDialogKey(Keys keyData){if (keyData Keys.Left || keyData Keys.Right || keyData Keys.Up || keyData Keys.Down){s…

23种设计模式-结构型模式

1.代理模式 在软件开发中,由于一些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为"代理"的第三者来实现间接访问.该方案对应的设计模式被称为代理模式. 代理模式(Proxy Design Pattern ) 原始定义是:让你能够提供对象的替代品或其占位符。…

ArcGIS Pro 如何计算长度和面积等数据?

要素的几何属性属于比较重要的信息,作为一款专业的GIS软件,ArcGIS Pro自然也是带有计算几何的功能,这里为大家介绍一下计算方法,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的矢量数据,除了矢…

Apache Commons Collection3.2.1反序列化分析(CC1)

Commons Collections简介 Commons Collections是Apache软件基金会的一个开源项目,它提供了一组可复用的数据结构和算法的实现,旨在扩展和增强Java集合框架,以便更好地满足不同类型应用的需求。该项目包含了多种不同类型的集合类、迭代器、队…

备战蓝桥杯---二分(入门)

话不多说,先来个模板题来回顾一下上次讲的: 下面是AC代码: 下面进入正题: 本题对1,2行与3,4行组合,再用二分查找即可实现n^2logn的复杂度。 下面是AC代码: 接题: 让我们…

【Python】03快速上手爬虫案例三:搞定药师帮

文章目录 前言1、破解验证码2、获取数据 前言 提示:通过用户名、密码、搞定验证码,登录进药师帮网站,然后抓取想要的数据。 爬取数据,最终效果图: 1、破解验证码 使用药师帮测试系统:https://dianrc.ysb…

Linux多线程详解

Linux线程和多线程 Linux线程概念什么是线程二级页表线程异常 Linux进程VS线程进程的多个线程共享进程和线程的关系 Linux线程控制线程创建获取线程ID线程终止 分离线程线程ID及进程地址空间布局线程ID及进程地址空间布局 Linux线程概念 什么是线程 在一个程序里的一个执行路…

Docker(第三部分)

1,Docker复杂安装说明 今天的优势会被明天趋势所取代 一切在云端 安装mysql主从复制 主从复制原理,默认你懂 主从搭建步骤 1,新建主从服务器容器实例3307 docker run -p 3307:3306 --name mysql-master\ -v /mydata/mysql-master/log:…

Spring Boot使用七牛云

一、引入和配置 //maven配置 <dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.7.0</version> </dependency>#七牛云application.yml配置 qiniu:# 配置accessKeyaccessKey: &qu…

Flask框架小程序后端分离开发学习笔记《5》简易服务器代码

Flask框架小程序后端分离开发学习笔记《5》 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 简易服务器代码 接口解析那一块很关键&#xff0c;学后端服务器这一块&#xff0c;感觉主要就是学习相应地址的接口怎么处理。 然后…

计算机毕业设计 | vue+springboot 超市账单管理系统(附源码)

1&#xff0c;绪论 1.1 开发背景 世界上第一个购物中心诞生于美国纽约&#xff0c;外国人迈克尔库伦开设了第一家合作商店&#xff0c;为了更好地吸引大量客流量&#xff0c;迈克尔库伦精心设计了低价策略&#xff0c;通过大量进货把商品价格压低&#xff0c;通过商店一次性集…

第 6 章:Linux中使用时钟、计时器和信号

在本章中&#xff0c;我们将开始探索Linux环境中可用的各种计时器。随后&#xff0c;我们将深入了解时钟的重要性&#xff0c;并探讨UNIX时间的概念。接下来&#xff0c;我们将揭示在Linux中使用POSIX准确测量时间间隔的方法。之后&#xff0c;我们将进入std::chrono的领域&…

【新书推荐】4.1 运算符与表达式

本节必须掌握的知识点&#xff1a; 运算符 表达式 优先级 4.1.1 运算符 说到运算符与表达式&#xff0c;估计大家不会感到陌生&#xff0c;因为我们平常生活中经常接触到&#xff0c;比如我们买2元钱的馒头&#xff0c;付给老板5元钱&#xff0c;需找零钱3元钱。这中间的计算…

RK3568 Android 13 系统裁剪

android 13 系统裁剪是个大工程&#xff0c;裁剪也是需要大量的测试&#xff0c;才能保证系统的稳定性&#xff0c;以下是RK官方给出的裁剪方案&#xff0c;有兴趣的可以去看一下&#xff0c;对裁剪不是要求过高的可以根据官方的建议&#xff0c;对系统进行裁剪: Rockchip And…

表贴式PMSM的直接转矩控制(DTC)MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 表贴式PMSM的直接转矩控制(DTC),直接使用滞环控制对转矩和磁链进行控制&#xff0c;相对于传统的FOC控制而言&#xff0c;其不需要进行解耦变换&#xff0c;在此次的有以下几点需要注意&#xff1a…

linux监控工具

官方吹的牛逼 LATEST BLOG POST: On the same workload, Netdata uses 35% less CPU, 49% less RAM, 12% less bandwidth, 98% less disk I/O, and is 75% more disk space efficient on high resolution metrics storage, while providing more than a year of overall reten…