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使用乐观锁机制,减少了锁冲突的可能性,提高了系统的吞吐量。
相关文章:

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

Element Plus阻止 el-dropdown、el-switch等冒泡事件
最近做vue3项目,使用Element Plus,又遇到坑了! 问题点:组件中遇到事件冒泡问题了,el-checkbox 中 change事件要求阻止冒泡,如下代码中要求点击checkbox时不调用li标签的show方法 <li click"show()">…...

Spring framework Day13:注解结合Java配置类
前言 前面我们管理 bean 都是在 xml 文件中去管理,本次我们将介绍如何在 Java 配置类中去管理 bean。 注解结合 Java 配置类是一种常见的 Spring 注入 Bean 的方式。通常情况下,开发人员会使用 Java Config 来定义应用程序的配置信息,而在 …...
彻底卸载自己安装的python
一.彻底卸载自己安装的python Python3 安装完后,在系统中不同目录下存在各种依赖关系,若需卸载,需要一步步无残留完全卸载干净。 删除Python 3.7 框架,打开终端,输入 sudo rm -rf /Library/Frameworks/Python.frame…...

ES相关面试问题整理
索引模板了解么 索引模板,一种复用机制,就像一些项目的开发框架如 Laravel 一样,省去了大量的重复,体力劳动。当新建一个 Elasticsearch 索引时,自动匹配模板,完成索引的基础部分搭建。 模板定义…...

MytatisP详解
MP详解 一、基础使用1.引入2.Entry中的常用注解3.BaseMapper 、IService、ServiceImpl3.1BaseMapper 3.2IService、ServiceImpl 4.常用配置4.1 application.yml配置4.2 configuration 配置 5.Wrapper6.分页6.1使用分页方式一 7.自定义分页:查询指定列7.1 先用MP的分…...
设计符合REST原则的API可以遵循以下步骤
设计符合REST原则的API可以遵循以下步骤: 定义资源:首先需要将需要交换的数据抽象成资源,即可以将数据看作是一种资源,并且为每种资源定义一个唯一的标识符。 设计URL:使用短的、有意义的方式来表示资源的状态。例如&…...

编程助手成为编程高手,帮您正则调试
官方下载地址:安果移动 视频演示地址:编程助手-正则调试与面试题,升职加薪不是梦_哔哩哔哩_bilibili 编程助手成为编程高手,帮您正则调试 软件介绍版本号 1.0.2更新日期 2023-10-11 找工作不敢谈薪资?总觉得公司欠我…...
opencv 双目立体视觉
单目标定 1.先单目标定每个相机,获得单个相机内参,外参,畸变参数。 双目标定 2.然后双面标定 2.1 stereoCalibrate (标定函数): double stereoCalibrate(InputArrayOfArrays objectPoints, //世界坐标系 InputArrayOfArrays imagePoints1, //左图像点 InputArrayOfA…...

如何将jpg转化为png?
如何将jpg转化为png?可能有的小伙伴就会疑惑了,jpg和png都是图片常用的一种格式,为什么要进行格式的更改呢?那是因为PNG格式具有更好的图片质量和更少的失真。JPG(或JPEG)格式的图片通常是压缩过的…...
查看 SSH 登录失败日志
查看日志文件 cat /var/log/auth.log查看 SSH 登录失败的记录 grep "Failed password\|authentication failure" /var/log/auth.log...

竞赛选题 深度学习+opencv+python实现车道线检测 - 自动驾驶
文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &am…...
MR混合现实模拟消防安全演练场景实训
混合现实(MR)是一种将虚拟世界与真实世界相结合的技术。它允许教师将数字元素融入实际场景,使学生在亲身体验中学习消防安全知识。这种方式不仅可以激发学生的学习兴趣,还能增强学生的记忆效果。 在MR的助力下,消防安全…...

geecg-uniapp 同源策略 数据请求 获取后台数据 进行页面渲染 ui库安装 冲突解决(3)
一,同源策略 (1)首先找到env 要是没有env 需要创建一个替换成后端接口 (2)因为他封装了 先找到 http 请求位置一级一级找 然后进行接口修改 (3)appUpdata 修改接口 运行即可 &#x…...

Krypton控件组使用之KryptonRibbon
1.去掉File按钮 2.去掉 Cutomize 菜单...

低压配电系统中浪涌保护器的作用,安装位置和接线方法
低压配电系统是指在变压器低压侧或用户侧的电气装置,主要用于向用户提供安全、可靠和经济的电能。低压配电系统中常见的电气设备有低压配电柜、分支箱、开关箱、插座、照明等。这些设备都需要防止因外部或内部原因产生的过电压对其造成损坏或影响其正常工作。过电压…...

OpenCV实现答题卡自动打分!
目录 1,主要原理以及函数介绍 全部代码,以 2 , 实现过程 3,结果展示 1,主要原理以及函数介绍 ap argparse.ArgumentParser() 创建一个ArgumentParser对象,并将其赋值给变量ap。这个对象可以接受我们的脚…...

Python编程必备:掌握列表遍历的6种神级技巧!
更多资料获取 📚 个人网站:涛哥聊Python 遍历列表是Python中最常见的任务之一,因为列表是一种非常常用的数据结构,它用于存储一组项目。 在编程中,经常需要对这些项目进行操作,例如查找特定元素ÿ…...

nodejs+vue校园失物招领平台
失物人可以在该平台中发布自己的拾物信息,本毕业设计题目将设计与实现一个基于校园的非商业行为的网上校园失物招领平台。并给出自己附加的各项条件, 失物招领管理系统主要分为两个部分,涉及前台和后台,然后由失主通过校园失物招…...
leetcode做题笔记171. Excel 表列序号
给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 输入: columnTitle "A" 输出: 1示例 2: 输入: colu…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...