MySQL MVCC详细介绍

MVCC概念

MVCC(Multi-Version Concurrency Control) 多版本并发控制,是一种并发控制机制,用于处理数据库中的并发读写操作,它通过在每个事务中创建数据的快照,实现了读写操作的隔离性,从而避免了读写冲突和数据不一致的问题。

MySQL基本并发控制机制

锁机制(当前读)

MySQL使用锁机制来控制并发访问数据库的操作,锁可以分为两种类型:共享锁(S锁)和排他锁(X锁);共享锁允许多个事务同时读取同一数据,而排他锁则只允许一个事务进行写操作。

这种方式它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。

对于我们日常的操作,如:select ... lock in share mode(共享锁),select ...
for update、update、insert、delete(排他锁)都是一种当前读。

MVCC(快照读)

MVCC是一种高级并发控制机制,它通过创建数据的快照和版本控制来实现读写操作的隔离性。MVCC允许事务在读取数据时看到之前的版本,从而避免了读写冲突和数据不一致的问题。

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

  • Read Committed(RR):每次select,都生成一个快照读。
  • Repeatable Read(RC):开启事务后第一个select语句才是快照读的地方。
  • Serializable:快照读会退化为当前读(加锁)。

MVCC的重要组件

Read View(读视图)

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

ReadView四个核心字段

快照是在每个事务开始时创建的一个数据库状态的副本,该快照包含了当前数据库中所有数据行的版本信息,每个事务在开始时会记录一个时间戳,用于标识该事务的开始时间。 读操作时,MySQL会根据事务开始的时间戳和快照中的版本信息来判断数据行的可见性。如果某个数据行的版本早于事务开始的时间戳,则该数据行对当前事务可见;反之,如果数据行的版本早于事务开始的时间戳或者被当前事务修改过,则该数据行对当前事务不可见。

不同的隔离级别,生成ReadView的时机不同:
READ COMMITTED :在事务中每一次执行快照读时生成ReadView。
REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

版本链

每个数据行都维护着一个版本链,该链表结构包含了该数据行的不同版本,每次对数据行进行修改时,MySQL会在版本链中创建一个新的版本,并将该版本与之前的版本连接起来。

版本链中的每个版本都包含了该版本的时间戳、事务ID以及数据行的值。通过版本链,MySQL能够追踪和管理数据行的历史变化,从而实现并发读写操作的隔离性。

Undo Log(回滚日志)

回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志,记录了事务对数据行的修改操作。当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。如果事务读取到了已被其他事务修改的数据版本,使用undo log中的信息将数据回滚到适当的版本,以确保事务读取的数据是一致的。

当事务需要回滚时,MySQL会根据Undo Log中的信息将数据行恢复到事务开始之前的状态。 Undo Log的实现方式是将事务对数据行的修改操作记录在磁盘上的一个日志文件中,在回滚操作时,MySQL会按照Undo Log中的日志记录,逆向执行相应的操作,将数据行恢复到原始状态。

MVCC原理分析

读已提交(RC)隔离级别

RC隔离级别下,在事务中每一次执行快照读时生成ReadView。

当一个事务开始时,它会获取一个读视图,并在读视图中记录当前活跃的事务和它们的提交状态。当事务执行读操作时,它会检查读视图中的信息来确定哪些版本的数据对该事务可见。 如果一个数据行的最新版本的时间戳早于事务的读视图创建时间戳,那么该数据行对事务是可见的。如果一个数据行的最新版本的时间戳晚于事务的读视图创建时间戳,那么该数据行对事务是不可见的,因为它是其他事务在事务开始之后修改的。

读视图记录了事务开始时的数据库状态,版本链用于跟踪数据行的不同版本。通过比较读视图和版本链中的时间戳,事务可以确定哪些数据对它是可见的。

可重复读(RR)隔离级别

RR隔离级别下,仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView,所以 在一个事务中,执行两次相同的select语句,查询到的结果是一样的。

当一个事务读取数据时,它只能看到在该事务开始时间之前已经提交的版本,这样,事务可以看到一致的快照视图,而不会受到其他并发事务的影响。

当一个事务修改数据时,它会为修改操作创建一个新的版本,并将该版本的时间戳设置为当前事务的时间戳,其他事务仍然可以读取旧版本的数据,直到当前事务提交。

MVCC的优点

- 并发性能优化:MVCC允许多个事务同时读取数据库,提高了并发性能。

- 隔离性:MVCC提供了读写操作的隔离性,避免了读写冲突和数据不一致的问题。

- 降低锁冲突:MVCC使用乐观锁机制,减少了锁冲突的可能性,提高了系统的吞吐量。

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

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

相关文章

GaN器件的工作原理

目录 AlGaN/GaNHEMT 器件工作原理(常开-耗尽型器件)常关 AlGaN/GaN 功率晶体管(增强型器件)HD-GIT与SP-HEMT AlGaN/GaNHEMT 器件工作原理(常开-耗尽型器件) 来源:毫米波GaN基功率器件及MMIC电路…

百度SEO优化的特点(方式及排名诀窍详解)

百度SEO优化的特点介绍: 百度SEO优化是指对网站进行优化,使其在百度搜索引擎中获得更好的排名,进而获取更多的流量和用户。百度SEO优化的特点是综合性强、效果持久、成本低廉、投资回报高。百度的搜索算法不断更新,所以长期稳定的…

宝塔面板服务器内存使用率高的三招解决方法

卸载多余PHP版本。假若安装了多个PHP版本,甚至把 php 5.3、5.4、7.0、7.3 全都安装上了,就会严重增加系统负载和内存使用率。 安装memcached 缓存组件,建议在宝塔面板后台直接安装。 卸载不常用软件。如:宝塔运维、宝塔一键安装…

不止硬件,苹果的软件也是频出问题!iOS 17.0.3使iPhone在一夜之间随机开关机

就在我们以为iPhone的问题已经解决了一段时间的时候,一个新的问题似乎突然出现了。在Reddit和其他网站上,人们报告说,他们的iPhone在一夜之间莫名其妙地断电,有时会导致错过警报。 目前尚不清楚是什么原因导致了这个问题&#xf…

基于海洋捕食者优化的BP神经网络(分类应用) - 附代码

基于海洋捕食者优化的BP神经网络(分类应用) - 附代码 文章目录 基于海洋捕食者优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.海洋捕食者优化BP神经网络3.1 BP神经网络参数设置3.2 海洋捕食者算法应用 4…

好用的跨平台同步笔记工具,手机和电脑可同步的笔记工具

在这个快节奏的工作环境中,每个人都在寻找一种方便又高效的方式来记录工作笔记。记录工作笔记可以帮助大家统计工作进展,了解工作进程,而如果工作中常在一个地方办公,直接选择电脑或者手机中笔记工具来记录即可,但是对…

spring boot Rabbit高级教程

消息可靠性 生产者重试机制 首先第一种情况,就是生产者发送消息时,出现了网络故障,导致与MQ的连接中断。 为了解决这个问题,SpringAMQP提供的消息发送时的重试机制。即:当RabbitTemplate与MQ连接超时后,…

Yakit工具篇:简介和安装使用

简介(来自官方文档) 基于安全融合的理念,Yaklang.io 团队研发出了安全领域垂直语言Yaklang,对于一些无法原生集成在Yak平台中的产品/工具,利用Yaklang可以重新编写 他们的“高质量替代”。对于一些生态完整且认可度较高的产品,Y…

基于linux的基础线程知识大总结

文章目录 1.线程的基础概念认知1.1什么是线程1.2线程的优缺点1.3一些页表知识的额外补充1.4进程和线程的对比 2.线程的基本控制2.1POSIX线程库2.2创建一个新的线程2.3有关线程id的解释和线程栈区的地址空间布局2.4线程终止2.5线程等待2.6线程分离 3.线程间互斥3.1基本概念3.2互…

【C++】笔试训练(六)

目录 一、选择题二、编程题1、不要二2、把字符串转换成整数 一、选择题 1、十进制变量i的值为100&#xff0c;那么八进制的变量i的值为&#xff08;&#xff09; A 146 B 148 C 144 D 142 答案&#xff1a;C 2、执行下面语句后的输出为 int I 1; if (I < 0)printf("…

vmware ubuntu 虚拟机 网卡图片消失处理办法

如图&#xff0c;这个图标消失处理办法&#xff1a; 输入如下指令&#xff1a;sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start

LightGBM-平分卡

文章目录 一、数据集处理二、定义模型训练和画图 三、好人的概率/坏人的概率四、生成报告五、行为评分卡模型表现总结 一、数据集处理 import pandas as pd from sklearn.metrics import roc_auc_score,roc_curve,auc from sklearn.model_selection import train_test_split f…

Python深度学习实践

线性模型 课程 import numpy as np import matplotlib.pyplot as plt x_data[1.0,2.0,3.0] y_data[2.0,4.0,6.0] #前馈函数 def forward(x):return x*w #损失函数 def loss(x,y):y_predforward(x)return (y_pred-y)*(y_pred-y) w_list[] mse_list[] for w in np.arange(0.0,4…

蓝桥杯(迷宫,C++)

输入&#xff1a; 思路&#xff1a; 1、注意输入用字符串。 2、采用广度搜素的方法来求解。 3、因为最后要求字典序最小且D<L<R<U,所以在遍历四个方向的时候&#xff0c; 先向下&#xff0c;再向左、右&#xff0c;最后向上。 #include<iostream> #include…

Redis 分布式锁 @Klock 注解详解及使用教程

文章目录 一、作用二、参数三、锁的流程四、SpringBoot 集成1. pom 依赖2. yaml 配置3. 使用方式 五、变量级锁和方法级锁六、常见应用场景1. 页面重复提交2. 定时任务3. 核心业务 七、锁的粒度与锁的时间 一、作用 注解 klock 是基于 Redis 的分布式锁&#xff0c;作用在分布…

javascript将html中的dom元素转图片

javascript将html中的dom元素转图片 百度网盘下载html2canvas.min.js&#xff1a; 全部文件-》js插件-》 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>网页中的某个区域转图片</title></head><body styl…

前端--CSS

文章目录 CSS的介绍 引入方式 代码风格 选择器 复合选择器 (选学) 常用元素属性 背景属性 圆角矩形 Chrome 调试工具 -- 查看 CSS 属性 元素的显示模式 盒模型 弹性布局 一、CSS的介绍 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精…

【K8S】集群中部署nginx应用 运行手写yaml文件报错排查过程

文章目录 ❌报错信息&#x1f50e;排查过程✅问题解决 ❌报错信息 提取报错信息【 unknown field “spec.selector.replicas”】【 unknown field “spec.selector.template”】 [rootmaster ~]# kubectl apply -f nginx-deployment.yaml Error from server (BadRequest): erro…

蓝桥杯双周赛算法心得——数树数(dfs)

大家好&#xff0c;我是晴天学长&#xff0c;一个简单的dfs思想&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .数树数 2) .算法思路 代码的主要逻辑是&#xff1a; 1.使用Scanner读取输入的整数n和q&#xff0c;其中n表示测试用例的数量&am…

数据结构与算法-栈

栈和队列是两种常用的线性结构&#xff0c;属于特殊的线性表&#xff0c;是线性表相关运算的一个子集。一般来说&#xff0c;线性表上的插入和删除操作不受任何限制&#xff0c;但栈只能在表的一端进行插入和删除操作&#xff0c;而队列则只能在一端进行插入操作&#xff0c;在…