MySQL的MVCC机制详解
1. 什么是MVCC?
MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库系统中用于实现并发控制的一种技术。它通过保存数据在某个时间点的快照来实现,使得在同一个数据行上可以同时存在多个版本,从而允许读操作不会阻塞写操作,写操作也不会阻塞读操作,提高了数据库的并发性能。
2. MVCC在MySQL中的应用
在MySQL中,MVCC主要应用于InnoDB存储引擎,用于实现事务的隔离级别,特别是“可重复读(REPEATABLE READ)”和“读已提交(READ COMMITTED)”隔离级别。MVCC通过为每行记录添加额外的版本信息来实现,使得不同事务可以访问到不同版本的数据。
3. MVCC的实现原理
3.1 版本链
在InnoDB中,每行记录除了存储实际数据外,还包含几个隐藏字段:
DB_TRX_ID
:最近一次修改该行记录的事务ID。DB_ROLL_PTR
:回滚指针,指向该行记录的上一个版本,用于构建版本链。DB_ROW_ID
:行ID,如果表没有定义主键,InnoDB会自动生成一个行ID作为聚簇索引。
3.2 Undo日志
Undo日志用于记录数据被修改前的值,以便在事务回滚时恢复数据。同时,Undo日志也用于实现MVCC,通过回滚指针(DB_ROLL_PTR
)将不同版本的数据行连接起来,形成一个版本链。
3.3 Read View
Read View是事务在某一时刻对数据库的一个快照,用于判断当前事务能够看到哪些版本的数据。Read View主要包含以下几个关键信息:
m_ids
:当前活跃事务ID的列表,即那些尚未提交的事务ID。min_trx_id
:m_ids
中的最小事务ID。max_trx_id
:系统应该分配给下一个事务的ID值。creator_trx_id
:创建该Read View的事务ID。
4. 如何判断数据版本是否可见
当事务执行一个查询操作时,会生成一个Read View,然后通过以下规则判断数据行的某个版本是否可见:
- 如果数据行版本的事务ID(
DB_TRX_ID
)小于min_trx_id
,表示该版本是已提交事务的修改,因此该版本对当前事务可见。 - 如果数据行版本的事务ID(
DB_TRX_ID
)大于等于max_trx_id
,表示该版本是当前事务开始之后才开启的事务的修改,因此该版本对当前事务不可见。 - 如果数据行版本的事务ID(
DB_TRX_ID
)在min_trx_id
和max_trx_id
之间,需要进一步判断:- 如果
DB_TRX_ID
在m_ids
列表中,表示该版本是由当前活跃事务修改的,因此该版本对当前事务不可见。 - 如果
DB_TRX_ID
不在m_ids
列表中,表示该版本是已提交事务的修改,因此该版本对当前事务可见。
- 如果
- 如果数据行版本的事务ID(
DB_TRX_ID
)等于creator_trx_id
,表示该版本是当前事务自己修改的,因此该版本对当前事务可见。
如果当前版本不可见,则通过回滚指针(DB_ROLL_PTR
)找到上一个版本,并重复上述判断过程,直到找到一个可见的版本或到达版本链的末尾。
5. 不同隔离级别下MVCC的行为
5.1 读已提交(READ COMMITTED)
在“读已提交”隔离级别下,每次执行查询操作时都会生成一个新的Read View。因此,一个事务可以看到其他事务已提交的修改。
5.2 可重复读(REPEATABLE READ)
在“可重复读”隔离级别下,一个事务在第一次执行查询操作时生成一个Read View,并在整个事务期间都使用这个Read View。因此,一个事务在事务期间看到的数据是一致的,不会看到其他事务已提交的修改。
6. 示例
假设有以下事务操作:
- 事务1(事务ID为100)将某行记录的值从A修改为B。
- 事务2(事务ID为101)将同一行记录的值从B修改为C。
此时,该行记录的版本链可能如下:
- 版本1:值A,事务ID为99,回滚指针指向NULL。
- 版本2:值B,事务ID为100,回滚指针指向版本1。
- 版本3:值C,事务ID为101,回滚指针指向版本2。
如果当前有一个事务3(事务ID为102)执行查询操作,其Read View的m_ids
为[100, 101],min_trx_id
为100,max_trx_id
为103,creator_trx_id
为102。事务3将按照以下步骤判断:
- 首先检查版本3,其事务ID为101,在
m_ids
列表中,因此不可见。 - 通过回滚指针找到版本2,其事务ID为100,同样在
m_ids
列表中,因此也不可见。 - 再通过回滚指针找到版本1,其事务ID为99,小于
min_trx_id
,因此可见,事务3将看到值A。
7. MVCC的优点
- 提高并发性能:读操作不会阻塞写操作,写操作也不会阻塞读操作。
- 避免脏读、不可重复读和幻读:通过版本控制,事务可以看到一致的数据视图。
8. 总结
MVCC是MySQL InnoDB存储引擎实现高并发事务处理的关键技术之一。通过保存数据行的多个版本,并利用Read View来判断数据版本的可见性,MVCC使得数据库在保证事务隔离性的同时,提高了并发性能。理解MVCC的实现原理,有助于我们更好地理解MySQL的事务处理机制,并优化数据库的并发性能。
相关文章:
MySQL的MVCC机制详解
1. 什么是MVCC? MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库系统中用于实现并发控制的一种技术。它通过保存数据在某个时间点的快照来实现,使得在同一个数据行上可以同时存在多个版本࿰…...
Postman做自动化测试
Postman也可以实现接口自动化 1.在Scripts写断言,图中红框处。不会写可以偷懒使用蓝框处会自动填写 2.单个运行调试,结果显示在TestResults 3.多个接口都写好断言并调通后,在包揽这些接口的文件夹下运行,图示以两个接口为例&…...
Meltdown原理介绍:用户空间读取内核内存
摘要 计算机系统的安全性从根本上依赖内存隔离,如,内核地址范围被标记为不可访问并受到保护,以防用户非法访问。本文介绍了Meltdown。 利用现代处理器上乱序执行,来读取内核任意的内存位置,包括个人数据和密码。乱序执行是必不可少的用来提升性能的手段,并在现代处理器中…...
数据结构和算法(七)--树
一、树 树是我们计算机中非常重要的一种数据结构,同时使用树这种数据结构,可以描述现实生活中的很多事物,例如家谱、单位的组织架构、等等。 树是由n(n>1)个有限结点组成一个具有层次关系的集合。把它叫做"树"是因为它看起来像一…...
UDP猜数字游戏与TCP文件传输案例解析
目录 案例一:UDP协议实现的猜数字游戏 游戏概述 服务器端代码 客户端代码 (udp_client.py) 游戏特点 案例二:TCP协议实现的文件传输工具 工具概述 服务器端代码 客户端代码 工具特点 总结对比 案例一:UDP协议实现的猜数字游戏 游…...
WPF View 与ViewModel注入对象
View 和ViewModel中使用同一个类型的类,注入的对象在主机中通过在服务中添加 AddTransient 获取的不是同一个对象,在 View 绑定了在ViewModel 中是取不到的,应该在View 中注入ViewModel 对象,使用View中的ViewModel对象里面的参数…...
如何下载免费地图数据?
按照以下步骤下载免费地图数据。 1、安装GIS地图下载器 从GeoSaaS(.COM)官网下载“GIS地图下载器”软件:,安装完成后桌面上出现”GIS地图下载器“图标。 双击桌面图标打开”GIS地图下载器“ 2、下载地图数据 点击主界面底部的“…...
B端可视化方案,如何助力企业精准决策,抢占市场先机
在当今竞争激烈的商业环境中,企业需要快速、准确地做出决策以抢占市场先机。B端可视化方案通过将复杂的企业数据转化为直观的图表和仪表盘,帮助企业管理层和业务人员快速理解数据背后的业务逻辑,从而做出精准决策。本文将深入探讨B端可视化方…...
IAR打包生成的hex和.a文件的区别
IAR打包生成的hex和.a文件的区别 在使用IAR Embedded Workbench进行嵌入式开发时,项目生成的文件中常见的两种文件类型是HEX文件和.a文件。它们在项目开发和部署过程中扮演着不同的角色。 HEX文件 定义与用途 HEX文件是一种十六进制表示的二进制文件格式…...
黑马点评:Redis消息队列【学习笔记】
目录 当前业务存在的问题 认识消息队列 List PubSub (publish subscribe) Stream 单消费模式 消费者组模式 对比 异步秒杀优化 当前业务存在的问题 JVM内存限制:当前使用的是JDK提供的阻塞队列,使用的是JVM的内存,如果不加以限制&…...
thinkphp:部署完整项目到本地phpstudy
一、准备工作 首先准备一个thinkphp的项目文件;准备mysql数据库 二、小皮初步搭建 1、建立网站 在小皮界面,网站->创建网站->输入域名,选择PHP版本等 注:确保端口未被占用 2、将项目文件放入根目录 网站->管理->…...
关于链接库
在 C# 中,链接库主要分为两种类型:托管链接库和非托管链接库,以下为你详细介绍它们的特点和导入方式: 托管链接库 特点 托管链接库通常是用 .NET 兼容的语言(如 C#、VB.NET 等)编写的,运行在…...
小程序返回按钮,兼容所有机型的高度办法
现象 在使用返回按钮的时候在不同机型上返回按钮小图标位置总是不一样,一会高一会低。 原因 因为手机的状态栏一般是不一样的,导致设置固定高度的时候就随时在改变。 解决办法 直接获取胶囊按钮的top值和height值将返回按钮的top值设置为一样的&…...
Docker镜像迁移指南:从Windows构建到Ubuntu运行
Docker镜像迁移指南:从Windows构建到Ubuntu运行 本文档详细介绍如何在Windows系统中构建SVM分类服务的Docker镜像,并将其迁移到Ubuntu系统中运行。 项目概述 本项目是一个使用FastAPI构建的SVM图像分类服务,可以将上传的图像分类为五种不同…...
XR技术赋能艺术展演|我的宇宙推动东方美学体验化
本次广州展览现场引入我的宇宙XR体验模块,通过空间计算与动作捕捉技术,让观众在潮玩艺术氛围中体验虚拟互动,打造“看得懂也玩得动”的展演新场景。 作为科技与文化融合的推动者,我的宇宙正在以“体验科技”为媒介,为潮…...
半导体制造如何数字化转型
半导体制造的数字化转型正通过技术融合与流程重构,推动着这个精密产业的全面革新。全球芯片短缺与工艺复杂度指数级增长的双重压力下,头部企业已构建起四大转型支柱: 1. 数据中枢重构产线生态 台积电的「智慧工厂4.0」部署着30万物联网传感器…...
windows虚拟机隐藏“弹出虚拟驱动”
PVE8 上安装的windows虚拟机,SCSI控制器使用了VitrlIO,安装virtio驱动后,右下角有弹出选项,virtio驱动的网卡、Balloon、串口等设备都是标准的PCI设备,支持热插拔,因此Windows系统会在界面上显示设备可以弹…...
AI工具箱源码+成品网站源码+springboot+vue
大家好,今天给大家分享一个靠AI广告赚钱的项目:AI工具箱成品网站源码,源码支持二开,但不允许转售!! 本人专门为小型企业和个人提供的解决方案。 不懂技术的也可以直接部署工具箱网站,成为站长&…...
《MySQL基础:了解MySQL周边概念》
1.登录选项的认识 -h:指明登录部署了mysql服务的主机,默认为127.0.0.1-P:指明要访问的端口号,默认为3306-u:指明登录用户-p:指明登录密码 2.什么是数据库 2.1认识数据库 第一点理解。 mysql是数据库的客户…...
零基础上手Python数据分析 (15):DataFrame 数据排序与排名 - 快速定位关键数据
写在前面 在上一篇文章中,我们学习了如何使用 Pandas 对 DataFrame 进行分组(groupby())和聚合(agg(), apply(), transform()),这使我们能够从不同维度对数据进行汇总和分析。然而,仅仅得到聚合结果往往不够,我们经常需要知道 “谁是第一?”,“哪些数据排在前面/后面…...
案例驱动的 IT 团队管理:创新与突破之路:第五章 创新管理:从机制设计到文化养成-5.1 创新激励体系-5.1.2 OKR 与创新项目的结合
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 OKR 与创新项目的结合:驱动 IT 团队突破性创新的机制设计1. 背景与挑战:创新管理的核心痛点1.1 传统绩效管理体系的失效1.2 OKR 的适应性优势 2. 机制…...
数据库10(代码相关语句)
while循环 declare avgprice numeric(10,2) set avgprice(select avg(price)from titles) //自定义参数 while avgprice<10 //循环条件 begin update titles set priceprice*1.1 end //循环语句操作,当avgprice<10,所有price都加0.1 case语句 查询authors表…...
【Pandas】pandas DataFrame tail
Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签(行标签和列标签&#…...
淘宝 API 与爬虫混合开发:突破官方接口限制的商品数据采集进阶方案
一、引言 在电商数据挖掘领域,获取淘宝商品数据是一项重要任务。淘宝提供了 API 接口,但其存在调用频率、数据范围等限制。为了更全面、高效地采集商品数据,我们可以采用淘宝 API 与爬虫混合开发的方案,结合两者的优势࿰…...
MAC-基于 Spring 框架的高并发批量任务处理方案
基于 Spring 框架的高并发批量任务处理方案 以下结合 Spring 的特性(如 @Async、线程池管理、事务控制)实现高并发批量任务处理,涵盖 任 务分片、异步执行、资源隔离、熔断降级 等核心能力。 一、线程池配置(资源隔离) 通过 ThreadPoolTaskExecut…...
文件包含漏洞 不同语言危险函数导致的漏洞详解
目录 1. 什么是文件包含漏洞? 2. 文件包含漏洞如何利用?实际案例解析 案例 1:PHP 本地文件包含(LFI) 案例 2:PHP 远程文件包含(RFI) 案例 3:Java 目录遍历与文件包含…...
Android ViewPager使用预加载机制导致出现页面穿透问题
缘由 在应用中使用ViewPager,并且设置预加载页面。结果出现了一些异常的现象。 我们有4个页面,分别是4个Fragment,暂且称为FragmentA、FragmentB、FragmentC、FragmentD,ViewPager在MainActivity中,切换时&#x…...
css 中float属性及clear的释疑
float属性可以让元素脱离文档流,父元素中的子元素设置为float,则会导致父元素的高度塌陷。 <style type"text/css"> .father{ /*没有给父元素定义高度*/background:#ccc; border:1px dashed #999; } .box01,.box02,.box0…...
SpringBoot异常处理之自定义统一的错误处理页面
总体来讲,springboot里处理异常有五种方式,先看第一种: 利用springboot的默认配置,我们自定义统一的错误处理页面 前面说了SpringBoot只是帮助我们做了整合的工作,做配一堆的默认配置工作,异常处理的配置…...
事务管理:确保数据一致性与业务完整性
摘要:本文围绕事务管理展开,先回顾事务基本概念与操作,后深入探讨Spring事务管理。通过具体案例剖析事务管理在实际应用中的问题及解决方案,详细介绍Transactional注解及其属性rollbackFor和propagation的使用。 关键词ÿ…...
回收镀锡废水的必要性(笔记)
镀锡废水若直接排放,将对环境、经济和社会造成多重危害,其回收处理具有迫切性和深远意义。以下从环境、资源、法规、技术与实践、可持续发展五大维度展开分析: 一、环境危害的紧迫性:重金属与污染物的致命威胁 成分复杂…...
java 洛谷题单【算法2-1】前缀和、差分与离散化
P8218 【深进1.例1】求区间和 解题思路 前缀和数组: prefixSum[i] 表示数组 a 的前 (i) 项的和。通过 prefixSum[r] - prefixSum[l - 1] 可以快速计算区间 ([l, r]) 的和。 时间复杂度: 构建前缀和数组的时间复杂度是 (O(n))。每次查询的时间复杂度是 …...
FoundationPose 4090部署 真实场景迁移
参考链接: github代码 4090部署镜像拉取 前期准备 搜狗输入法安装 4090双屏不ok:最后发现是hdmi线坏了。。。。 demo 复现 环境部署(docker本地化部署) 拉取镜像 docker pull shingarey/foundationpose_custom_cuda121:late…...
[dp14_回文串] 分割回文串 II | 最长回文子序列 | 让字符串成为回文串的最少插入次数
目录 1.分割回文串 II 题解 2.最长回文子序列 题解 3.让字符串成为回文串的最少插入次数 题解 回文串,想通过s[i] s[j] 来实现状态变化,由二维数组 右下角 开始扩散 1.分割回文串 II 链接: 132. 分割回文串 II 给你一个字符串 s&…...
美团一面总结
八股的问题里Spring存在不足,无法将八股的知识和项目串联起来。 记录几个值得研究的问题: 端口80到8080是怎么到的 又是怎么一步一步到controller? [用户请求80端口] ↓ [Nginx监听80端口并转发 → 8080] ↓ [Tomcat监听8080端口,…...
Selenium2+Python自动化:利用JS解决click失效问题
文章目录 前言一、遇到的问题二、点击父元素问题分析解决办法实现思路 三、使用JS直接点击四、参考代码 前言 在使用Selenium2和Python进行自动化测试时,我们有时会遇到这样的情况:元素明明已经被成功定位,代码运行也没有报错,但…...
PyTorch的benchmark模块
PyTorch的benchmark模块主要用于性能测试和优化,包含核心工具库和预置测试项目两大部分。以下是其核心功能与使用方法的详细介绍: 1. 核心工具:torch.utils.benchmark 这是PyTorch内置的性能测量工具,主要用于代码片段的执行时间…...
基于MLKit的Android人脸识别应用开发实践
基于MLKit的Android人脸识别应用开发实践 https://gitee.com/wenhua512/face-recognition 1. 项目概述 1.1 功能特点 实时人脸检测与跟踪人脸特征提取与识别自动/手动采集模式人脸数据管理相机参数优化 1.2 技术选型 MLKit人脸检测MediaPipe人脸网格CameraX相机框架Room数…...
【技术派后端篇】ElasticSearch 实战指南:环境搭建、API 操作与集成实践
1 ES介绍及基本概念 ElasticSearch是一个基于Lucene 的分布式、高扩展、高实时的基于RESTful 风格API的搜索与数据分析引擎。 RESTful 风格API的特点: 接受HTTP协议的请求,返回HTTP响应;请求的参数是JSON,返回响应的内容也是JSON…...
Spring Boot 应用程序中配置使用consul
配置是 Spring Boot 应用程序中的一部分,主要用于配置服务端口、应用名称、Consul 服务发现以及健康检查等功能。以下是对每个部分的详细解释: 1. server.port server:port: 8080作用:指定 Spring Boot 应用程序运行的端口号。解释…...
【设计模式——策略模式】
为什么要使用策略模式? 策略模式是一种行为设计模式,它允许在运行时选择算法或行为。通过将算法封装在独立的类中,客户端可以在运行时动态地选择和切换算法,而无需修改原有代码。这种模式特别适合需要灵活切换行为的场景。 形象…...
helm账号密码加密
1、安装工具 sudo apt update sudo apt install gnupg -y wget https://github.com/getsops/sops/releases/download/v3.10.2/sops-v3.10.2.linux.amd64 mv sops-v3.10.2.linux.amd64 /usr/local/bin/sops chmod x /usr/local/bin/sops2、生成加密文件 gpg --full-generate-…...
【今日三题】添加字符(暴力枚举) / 数组变换(位运算) / 装箱问题(01背包)
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 添加字符(暴力枚举)数组变换(位运算)装箱问题(01背包) 添加字符(暴力枚举) 添加字符 当在A的开头或结尾添加字符直到和B长度…...
数据处理与GUI开发场景下Python常见类型错误解析与应对策略
数据处理与GUI开发场景下Python常见类型错误解析与应对策略 前言 Python 作为一种广泛应用于数据处理和 GUI 开发的高级编程语言,其动态类型特性为开发者带来了极大的灵活性,但同时也容易引发各种类型错误。在数据处理中,从数据采集、清洗到…...
【论文阅读笔记】模型的相似性
文章目录 The Platonic Representation Hypothesis概述表征收敛的依据表征收敛的原因实验依据未来发展的局限性 Similarity of Neural Network Representations Revisited概述问题背景相似性度量s的性质可逆线性变换不变性正交变换不变性各向同性缩放不变性典型度量满足的性质 …...
MVC协同工作流程
1. 视图层(View)代码作用 核心代码示例(以JSP为例): <!-- register.jsp --> <form action"registerServlet" method"post">用户名: <input type"text" na…...
OpenGL shader开发实战学习笔记:第十章 法线贴图
1. 10 法线贴图 1.1. 什么是法线贴图 我们如果想要在盾牌上实现凹凸感,应该如何做?一种方法是添加更多的顶点来建模更多的细节,但是网格的顶点越多,渲染网格所需的顶点着色器计算就越多,网格占用的内存就越多。大多数…...
神经光子渲染:物理级真实感图像生成——从麦克斯韦方程到深度学习
一、技术背景与核心突破 2025年,神经光子渲染(Photonic Neural Rendering, PNR)技术通过物理光学方程与神经辐射场的深度融合,在AIGC检测工具(如GPTDetector 5.0)的识别准确率从98%降至12%。该技术突破性地…...
MCP 协议知识分享
MCP 协议知识分享 一、MCP 协议概述1.1 定义与背景1.2 核心价值1.3 与传统 API 的对比 二、技术架构与工作原理2.1 核心组件2.2 通信机制2.3 典型工作流程 三、关键技术与应用场景3.1 核心技术3.2 典型应用场景 四、与微软技术的集成4.1 Azure OpenAI 服务4.2 Playwright MCP 服…...
spring boot 文件下载
1.添加文件下载工具依赖 Commons IO is a library of utilities to assist with developing IO functionality. <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version> </depe…...