MySQL MVCC详解

news2024/11/25 10:39:29

为什么需要MVCC

在没有MVCC之前,是使用读写锁(共享锁/排它锁)来进行并发控制的,读锁和读锁之间不互斥,写锁和读锁互斥,写锁和写锁互斥。
但是频繁加锁会导致数据库性能低下,这时出现了一种不加锁来解决读写冲突的方法,它会让数据库维护每条数据的多个版本,让不同的事务看到特定版本的数据,这个方法就是MVCC。

什么是MVCC

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种用来解决读写冲突的无锁并发控制的方法,可以提高数据库并发读写的性能。

什么是快照读和当前读

快照读

不加锁的select操作是快照读,快照读读到的数据可能是之前的历史版本。快照读的实现是基于MVCC。

当前读

像select lock in share mode(共享锁),select for update,update,insert,delete(排它锁)这些操作都是当前读,它读取的是记录的最新版本,读取时会对这些记录加锁,保证其他并发事务不能修改这些记录。

MVCC的实现原理

MVCC是通过隐式字段,undo log和read view来实现的。

隐式字段

InnoDB在表中每行记录的后面,都隐式记录了几个隐藏的字段:

  1. DB_ROW_ID:自增ID,如果数据表没有主键,InnoDB会以DB_ROW_ID来生成聚簇索引
  2. DB_TRX_ID:最近插入/修改事务ID,记录创建该记录/最后一次修改该记录的事务ID
  3. DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本
    在这里插入图片描述

Undo Log

undo log就是为了实现回滚操作而记录的日志。undo log分为两种,分别为:

  1. insert undo log:在插入数据时产生,会记录这条数据的主键值,回滚时会将这个主键值对应的记录删掉。只在事务回滚时需要,所以在事务提交后会被立即丢弃。
  2. update undo log:在更新或删除时产生,会把修改这条记录前的旧值都记录下来,回滚时会将这个记录更新为旧值。不仅在事务回滚时需要,在快照读时也需要,所以不能随便删除;只有当日志不再会被用到时,才会被purge线程清除。

在MVCC中用到的是update undo log,它的结构如下:
在这里插入图片描述

Read View

read view就是事务进行快照读操作的时候生成的读视图(并不是每次快照读都会生成),read view主要包含以下四个属性:

  1. trx_list:活跃的事务ID列表;
  2. creator_trx_id:当前事务ID;
  3. up_limit_id:记录trx_list中最小的事务ID;
  4. low_limit_id:尚未分配的下一个事务ID。

当读取一条数据时,会先将这条数据的最新记录的DB_TRX_ID取出来,和read view中的属性进行可用性判断,如果不符合可见性的话,那就会通过DB_ROLL_PTR去undo log中取出上一个版本记录中的事务ID再进行可见性判断,以此类推,直到找到可见的记录为止。

可见性判断是使用可见性算法实现的,具体判断过程如下:

  1. 如果 DB_TRX_ID < up_limit_id 或 DB_TRX_ID == creator_trx_id,则该记录可见;
  2. 如果 DB_TRX_ID >= low_limit_id,则该记录不可见;
  3. 判断DB_TRX_ID是否在trx_list中;如果在,说明生成read view的时候,修改这个记录的事务还没提交,所以该记录不可见;如果不在trx_list中,说明生成read view之前修改这个记录的事务已经提交了,所以该记录可见。

事务隔离级别与MVCC的关系

READ UNCOMMITTED(读未提交)

READ UNCOMMITTED级别直接读取数据的最新记录,因此不会使用MVCC。

READ COMMITTED(读已提交)

READ COMMITTED级别会使用MVCC,在每次进行快照读都会生成新的read view,所以每次读取到的都是已提交的最新版本的记录,这样就可以解决脏读问题。

REPEATABLE READ(可重复读)

REPEATABLE READ级别会使用MVCC,只有在第一次进行快照读会生成read view,之后的快照读都会沿用第一次生成的read view,所以每次快照读读到的数据都是一样的,这样就可以解决脏读问题以及快照读的不可重复读、幻读问题。
RR级别下当前读的不可重复读问题
在快照读和当前读同时使用时,仍然有可能发生不可重复读的问题,需要使用行锁来解决。
RR级别下当前读的幻读问题
在快照读和当前读同时使用时,仍然有可能发生幻读的问题,需要使用next-key锁(行锁+gap锁)来解决。

SERIALIZABLE(串行化)

SERIALIZABLE级别是通过加锁来访问数据,因此不会使用MVCC。

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

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

相关文章

数字脉冲参数

脉冲幅度vm。脉冲电压波形变化的最大值&#xff0c;单位为伏&#xff08;v&#xff09;。脉冲上升时间tr。脉冲波形从0.1vm上升到0.9vm所需的时间。脉冲下降时间tf。脉冲波形从0.9vm下降到0.1vm所需的时间。 脉冲上升时间tr和下降时间tf越短&#xff0c;越接近于理想的短形脉冲…

Redis实战——Redisson分布式锁

目录 1 基于Redis中setnx方法的分布式锁的问题 2 Redisson 2.1 什么是Redisson 2.2 Redisson实现分布式锁快速入门 2.3 Redisson 可重入锁原理 什么是可重入锁&#xff1f; Redisson中又是如何实现的呢&#xff1f; 2.4 Redisson分布式锁的可重试性 2.5 Redisson分布式锁的主从…

【C语言经典题目】调整奇数偶数顺序、有序序列合并以及有序序列判断

目录 一、调整奇数偶数顺序 1.思路一&#xff08;使用多个数组&#xff09; ①使用两个数组&#xff08;双指针法&#xff09; ②使用三个数组 2.思路二&#xff08;不创建其他的数组&#xff0c;双指针&#xff09; 二、有序数组合并 1.思路一 2.思路二 三、有序序列判…

【springboot进阶】基于starter项目构建(二)构建starter项目-mysql

目录 一、创建 mysql-spring-boot-starter 项目 二、添加 pom 文件依赖 三、构建配置 1. mybatis-plus分页配置 MybatisPlusConfig 2. mybatis-plus代码生成器 CodeGenerator 四、加载自动化配置 五、打包 六、使用 这个系列讲解项目的构建方式&#xff0c;主要使用 父…

第二证券|事关A股!4万亿外资巨头最新研判

时值年末&#xff0c;在多重利好音讯提振下&#xff0c;我国股市迎来一波反弹&#xff0c;海外本钱大举加仓我国财物。下一年全球经济将走向何方&#xff1f;国内和海外商场又会有哪些变化&#xff1f;财物装备该怎样做&#xff1f;近期&#xff0c;联博资深商场策略师黄森玮、…

PyTorch - Cifar 数据集

文章目录项目说明cifar-10 数据集介绍代码实现构建数据集、加载器构建 卷积网络训练数据构建 VGG 加深网络训练测试项目说明 cifar-10 数据集介绍 cifar-10 数据集由 60000 张分辨率为 32x32 彩色图像组成&#xff1b; 共分为 10 类&#xff0c;每类包含 6000 张图像&#xff…

深入理解mysql的索引分类,覆盖索引,覆盖索引失效,回表,MRR

MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/128273593【三】深入理解mysql的索引分类&a…

odps创建周期任务及字符串与日期函数用法

odps简介 PB/EB级数据的离线存储(存储资源)及逻辑处理(计算资源)&#xff0c;集群可用性全托管。 MaxCompute(odps)是适用于数据分析场景的企业级SaaS&#xff08;Software as a Service&#xff09;模式云数据仓库&#xff0c;以Serverless架构提供快速、全托管的在线数据仓库…

[附源码]Python计算机毕业设计SSM基于的民宿租赁系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

STS安装反编译插操作

第一步&#xff1a;下载net.sf.jadclipse_3.3.0.ja离线插件 首先​​​​​​下载离线插件 JadClipse - Eclipse plugin download | SourceForge.netDownload JadClipse - Eclipse plugin for free. Jad Java decompiler plugin for Eclipse IDE.https://sourceforge.net/proj…

Java自定义注解实现

一、注解的定义和作用 1、定义   注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&…

51的原理图和pcb的注意事项及出现的问题与解决办法

本次总结基于立创eda的注意事项总结&#xff0c;如有疑问&#xff0c;欢迎交流。 1.焊盘设成地网络&#xff01;&#xff01;&#xff01;&#xff01; 2.pcb的基本步骤是布局---布线---泪滴---铺铜---缝合孔&#xff0c;记得泪滴和缝合孔!! 3.元器件的封装要选择贴片的 这样…

认识阻塞队列

认识阻塞队列一、相关概念1.1 阻塞队列是什么1.2 生产者消费者模型二、标准库中的阻塞队列2.1 使用2.2 生产者消费者模型实现三、实现阻塞队列3.1 循环队列3.2 实现的细节3.3 代码一、相关概念 1.1 阻塞队列是什么 阻塞队列是一种特殊的队列&#xff0c;也遵守 “先进先出” …

CENTOS上的网络安全工具(十六)容器特色的Linux操作

这一篇&#xff0c;我们继续在Docker上折腾。之前我们已经展示了如何在容器上搭建安全产品的部署环境&#xff0c;这里我们需要更进一步&#xff0c;讨论如何在容器上搭建开发与调试环境。这是学习安全产品并且自己构建安全产品的基础步骤。 〇、精简系统上的操作技巧 使用Dock…

【LeetCode】直线上最多的点数 [H](几何)

149. 直线上最多的点数 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给你一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1&#xff1a; 输入&#xff1a;points [[1,1],[2,2],[3,3]] 输出&a…

【数据结构与算法分析】0基础带你学数据结构与算法分析11--AVL树

目录 二分查找 AVL 树 AVL 的平衡因子 AVL 的插入操作 单旋转 双旋转 对 AVL 树插入的总结 AVL 的移除操作 如果给定一个序列&#xff0c;你将如何在这个序列中查找一个给定元素 target&#xff0c;当找到时返回该元素的迭代器&#xff0c;否则返回末尾迭代器。首先排除…

python基于flask搭建http服务(二)—— 实现Excel上传、数据清洗、入库

一、技术点 利用flask 搭建简易的http服务,实现服务端文件上传;利用Blueprint将不同业务拆分至不同文件;利用bootstrap-fileinput组件构建页面;利用flask_cors配置允许跨域请求;利用sqlalchemy实现数据库连接;利用pandas实现Excel读取、清洗、入库;二、具体实现 2.1 目…

基于intel i3/i5/i7 视觉控制器 4个POE GigE

XM-5143 是针对机器视觉行业GigE相机应用场景的一款高性能工业计算机&#xff0c;可使用Intel 6/7代 65W 高性能CPU应对快速检测。4路独立Intel网络芯片&#xff0c;并支持POE供电&#xff0c;可减少布线。并配有快速隔离可编程DI/O芯片. XM-5143的规格产品类型机器视觉控制器防…

分布式事务都有哪些,到底有什么用,在项目当中该用哪个?

分布式的CAP理论应该是人尽皆知了&#xff0c;它描述了一致性&#xff08;C&#xff09;、可用性&#xff08;A&#xff09;、分区容错性&#xff08;P&#xff09;的一系列权衡。很多时候&#xff0c;我们要在一致性和可用性之间权衡&#xff0c;而分布式事务&#xff0c;就是…

20.EC实战 笔记本电脑的休眠唤醒是如何实现的

文章目录 1. EC什么时候(收到什么命令)之后来执行S0-->S3下电时序?2. S3(休眠)状态应该保留哪些电源?3. 控制笔记本进入休眠状态的三种方式总结:前言: 最近很多朋友在咨询休眠唤醒的问题,在笔记本中,休眠唤醒是一个基本功能,如果连休眠唤醒都没有,就失去了笔记本…