当前位置: 首页 > news >正文

MySQL中的MVCC解析

MySQL中的MVCC解析

多版本并发控制是MySQL中实现高并发的一种关键技术。通过对数据进行多版本的管理,MVCC能够在保证数据一致性的同时,提高数据库的并发性能。本文将深入探讨MySQL中的MVCC机制,包括其原理、实现方式以及优势。

MVCC的原理

多版本并发控制是一种避免锁的并发控制策略。在MVCC中,每个事务开始时都会基于当前的数据版本创建一个全局版本号,并在事务执行过程中维护这个版本号。当事务对数据进行读取或写入时,会检查数据的版本号与事务的版本号之间的关系,以确保数据的一致性和隔离性。

MVCC的关键组件

1. 版本号

每个数据项都有一个版本号,通常由创建该数据项的事务ID组成。版本号用于标识数据项的创建和更新历史。

2. 全局版本号

每个事务开始时都会分配一个全局版本号,用于标识事务的开始时间点。全局版本号通常由一个递增的数字组成,确保每个事务的全局版本号都是唯一的。

3. 事务版本号

每个事务都有一个唯一的事务版本号,用于标识事务的身份。事务版本号通常由全局版本号和事务的起始时间戳组成。

隐藏字段

  1. DB_TRX_ID(6字节):用来记录最近一次对本记录插入或修改的事务ID。删除操作也会视为一个update操作,只是会额外修改删除标记(DELETE BIT)。
  2. DB_ROLL_PTR(7字节):指向当前行的undo log信息,也叫回滚指针。
  3. DB_ROW_ID(6字节):随新行插入而单调递增的行ID。

Undo log分类

Undo log分类:

  1. Insert Undo Log:事务插入新记录时产生的undo log。只在事务回滚时需要,并且在事务提交后就可以立即丢弃。
  2. Update Undo Log:事务进行delete和update操作时产生的undo log。不仅在事务回滚时需要,快照读也需要。只有当数据库所使用的快照中不涉及该日志记录时,对应的undo log才会被purge线程删除。

Purge线程

Purge线程就是用来处理这些已删除或更新的记录的线程。它会扫描Undo段中的记录,将不再需要的记录标记为可回收,并在适当的时候将其从磁盘上删除。这样可以减少磁盘空间的占用,提高系统的性能。

MVCC的实现方式

1. 读取阶段
  • 快照读:在读取数据时,MVCC会根据事务的全局版本号创建一个数据快照。快照中包含了事务开始时刻的所有数据版本,并且不会受到其他并发事务的影响。
    • REPEATABLE-READ级别:事务begin后,第一条SELECT语句会
      创建一个快照,读取满足可见性的数据,之后该事务会一直用这个
      快照,直到事务结束
    • READ-COMMITTED级别:事务begin后,每条SELECT语句都会
      重置快照(重新创建快照)读取当前满足可见性的数据
  • 版本检查:在读取数据项时,MVCC会检查数据项的版本号。如果数据项的版本号小于等于事务的全局版本号,说明数据项是可见的;否则,数据项不可见。
2. 写入阶段
  • 数据加锁:在写入数据时,MVCC会对需要更新的数据项加锁,以防止其他事务同时修改这些数据项。
  • 版本更新:一旦数据项被锁定,MVCC会更新数据项的版本号为当前事务的全局版本号,并写入新的数据值。

MVCC的优势

1. 高并发性能

由于MVCC避免了长时间的锁定,多个事务可以同时读取和写入数据,从而提高了数据库的并发性能。

2. 数据一致性

MVCC通过版本号的管理,确保了数据在不同事务之间的一致性和隔离性,避免了脏读、不可重复读和幻读等并发问题。

3. 减少死锁

MVCC通过避免锁的使用,减少了死锁的发生概率,提高了数据库的稳定性。

总结

多版本并发控制是MySQL中实现高并发和数据一致性的关键技术。通过维护数据项的多版本信息,MVCC能够有效地解决并发访问带来的问题,提高数据库的性能和稳定性。对于数据库管理员和开发者而言,了解MVCC的原理和实现方式,有助于更好地优化数据库应用的设计和性能。

相关文章:

MySQL中的MVCC解析

MySQL中的MVCC解析 多版本并发控制是MySQL中实现高并发的一种关键技术。通过对数据进行多版本的管理,MVCC能够在保证数据一致性的同时,提高数据库的并发性能。本文将深入探讨MySQL中的MVCC机制,包括其原理、实现方式以及优势。 MVCC的原理 …...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日聚会(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…...

初识STM32:芯片基本信息

STM32简介 STM32是ST公司基于ARM公司的Cortex-M内核开发的32位微控制器。 ARM公司是全球领先的半导体知识产权(IP)提供商,全世界超过95%的智能手机和平板电脑都采用ARM架构。 ST公司于1987年由意大利的SGS微电子与法国的Thomson半导体合并…...

Zabbix 配置PING监控

Zabbix PING监控介绍 如果需要判断机房的网络或者主机是否正常,这就需要使用zabbix ping,Zabbix使用外部命令fping处理ICMP ping的请求,在基于ubuntu APT方式安装zabbix后默认已存在fping程序。另外zabinx_server配置文件参数FpingLocation默…...

异常解决(三)-- Wandb fails with ServiceStartProcessError

原文链接:https://github.com/wandb/wandb/issues/5765 我的环境配置: Python3.8.16 Wandb0.17.4 在使用Wandb记录实验数据时, 报以下错误: ServiceStartProcessError: The wandb service process exited with 1. Ensure that s…...

Qt调用Matlab(一)

目录 1 概述2 创建Qt工程2.1 增加Matlab支持3 调用Matlab3.1 widget.h3.2 widget.cpp4 运行4.1 配置4.2 运行1 概述 MATLAB是MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域…...

网络爬虫(二) 哔哩哔哩热榜高频词按照图片形状排列

我们有时候需要爬取结果生成为自定义的词云图 生成自定义的词云图通常需要以下步骤: 1. 爬取数据:使用爬虫工具或库,如requests、BeautifulSoup等,可以爬取网页、论坛、社交媒体等平台上的文本数据。 2. 数据预处理&#xff1a…...

MySQL 常见错误及解决方案

1. Too many connections 运行环境:Winows11、Phpstudy V8.1.1.3、MySQL 5.7.26 同一时间 MySQL 的连接数量有限制,当超过上限时将提示下面错误信息: 1040 - Too many connections 查看当前最大连接数 mysql> show variables like %max_…...

STM32 - 内存分区与OTA

最近搞MCU,发现它与SOC之间存在诸多差异,不能沿用SOC上一些技术理论。本文以STM L4为例,总结了一些STM32 小白入门指南。 标题MCU没有DDR? 是的。MCU并没有DDR,而是让代码存储在nor flash上,临时变量和栈…...

RAG理论:ES混合搜索BM25+kNN(cosine)以及归一化

接前一篇:RAG实践:ES混合搜索BM25+kNN(cosine) https://blog.csdn.net/Xin_101/article/details/140230948 本文主要讲解混合搜索相关理论以及计算推导过程, 包括BM25、kNN以及ES中使用混合搜索分数计算过程。 详细讲解: (1)ES中如何通过BM25计算关键词搜索分数; (2)…...

分享大厂对于缓存操作的封装

hello,伙伴们好久不见,我是shigen。发现有两周没有更新我的文章了。也是因为最近比较忙,基本是993了。 缓存大家再熟悉不过了,几乎是现在任何系统的标配,并引申出来很多的问题:缓存穿透、缓存击穿、缓存雪崩…...

冯诺依曼体系结构与操作系统(Linux)

文章目录 前言冯诺依曼体系结构(硬件)操作系统(软件)总结 前言 冯诺依曼体系结构(硬件) 上图就是冯诺依曼体系结构图,主要包括输入设备,输出设备,存储器,运算…...

开源六轴协作机械臂myCobot280实现交互式乘法!让学习充满乐趣

本文经作者Fumitaka Kimizuka 授权我们翻译和转载。 原文链接:myCobotに「頷き」「首振り」「首傾げ」をしてもらう 🤖 - みかづきブログ・カスタム 引言 Fumitaka Kimizuka 创造了一个乘法表系统,帮助他的女儿享受学习乘法表的乐趣。她可以…...

[C++][CMake][嵌套的CMake]详细讲解

目录 0.前言 & 准备1.节点关系2.添加子目录3.解决问题1.根目录2.calc目录3.sort目录4.calc_test目录5.sort_test 4.注意 0.前言 & 准备 如果项目很大,或者项目中有很多的源码目录,在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#…...

尚品汇-(十三)

&#xff08;1&#xff09;查询sku列表 在ManageService 中添加 /*** SKU分页列表* param pageParam* return*/ IPage<SkuInfo> getPage(Page<SkuInfo> pageParam);接口实现类 Override public IPage<SkuInfo> getPage(Page<SkuInfo> pageParam) {Qu…...

python小练习04

三国演义词频统计与词云图绘制 import jieba import wordcloud def analysis():txt open("三国演义.txt",r,encodingutf-8).read()words jieba.lcut(txt)#精确模式counts {}for word in words:if len(word) 1:continueelif word "诸葛亮" or word &q…...

小试牛刀-Solana合约账户详解

目录 一.Solana 三.账户详解 3.1 程序账户 3.2 系统所有账户 3.3 程序派生账户(PDA) 3.4 Token账户 四、相关学习文档 五、在线编辑器 Welcome to Code Blocks blog 本篇文章主要介绍了 [Solana合约账户详解] ❤博主广交技术好友&#xff0c;喜欢文章的可以关注一下❤ …...

Spring Boot+Vue项目从零入手

Spring BootVue项目从零入手 一、前期准备 在搭建spring bootvue项目前&#xff0c;我们首先要准备好开发环境&#xff0c;所需相关环境和软件如下&#xff1a; 1、node.js 检测安装成功的方法&#xff1a;node -v 2、vue 检测安装成功的方法&#xff1a;vue -V 3、Visu…...

Vue+Xterm.js+WebSocket+JSch实现Web Shell终端

一、需求 在系统中使用Web Shell连接集群的登录节点 二、实现 前端使用Vue&#xff0c;WebSocket实现前后端通信&#xff0c;后端使用JSch ssh通讯包。 1. 前端核心代码 <template><div class"shell-container"><div id"shell"/>&l…...

用 adb 来模拟手机插上电源和拔掉电源的情形

实用的 ADB 命令 要模拟手机从 USB 充电器上拔掉的情形&#xff0c;你可以使用&#xff1a; adb shell dumpsys battery set usb 0或者&#xff0c;如果你使用的是 Android 6.0 或更高版本的设备&#xff0c;你可以使用&#xff1a; adb shell dumpsys battery unplug要重新…...

如何快速掌握深度学习调参技巧:tuning_playbook_zh_cn完全解析

如何快速掌握深度学习调参技巧&#xff1a;tuning_playbook_zh_cn完全解析 【免费下载链接】tuning_playbook_zh_cn 一本系统地教你将深度学习模型的性能最大化的战术手册。 项目地址: https://gitcode.com/gh_mirrors/tu/tuning_playbook_zh_cn tuning_playbook_zh_cn是…...

Qwen3-VL-4B Pro科研绘图生成:根据论文描述反向生成示意图初稿

Qwen3-VL-4B Pro科研绘图生成&#xff1a;根据论文描述反向生成示意图初稿 1. 项目概述 科研工作者经常面临一个痛点&#xff1a;在论文写作过程中&#xff0c;明明有清晰的理论描述和实验方案&#xff0c;却需要花费大量时间绘制专业的示意图。现在&#xff0c;借助Qwen3-VL…...

5步实现黑苹果零门槛配置:智能工具的降维打击方案

5步实现黑苹果零门槛配置&#xff1a;智能工具的降维打击方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 当你第三次因为ACPI补丁错误导致系统崩溃…...

重构macOS开发流程:OpenInTerminal如何提升开发者环境切换效率

重构macOS开发流程&#xff1a;OpenInTerminal如何提升开发者环境切换效率 【免费下载链接】OpenInTerminal ✨ Finder Toolbar app for macOS to open the current directory in Terminal, iTerm, Hyper or Alacritty. 项目地址: https://gitcode.com/gh_mirrors/op/OpenInT…...

TouchGal:打造纯净Galgame社区的5个简单步骤

TouchGal&#xff1a;打造纯净Galgame社区的5个简单步骤 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next TouchGal是一个专为视觉小说…...

如何高效捕获网页媒体资源:猫抓浏览器插件智能解决方案

如何高效捕获网页媒体资源&#xff1a;猫抓浏览器插件智能解决方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字内容爆炸的时代&#xff0c;网页中的视频、音频和图片资源往往难以直接保存&…...

Django CORS Headers 终极指南:10个企业级跨域架构设计技巧

Django CORS Headers 终极指南&#xff1a;10个企业级跨域架构设计技巧 【免费下载链接】django-cors-headers Django app for handling the server headers required for Cross-Origin Resource Sharing (CORS) 项目地址: https://gitcode.com/gh_mirrors/dj/django-cors-he…...

图像处理中的NCC算法:从原理到优化(附Python实现对比)

图像处理中的NCC算法&#xff1a;从原理到优化&#xff08;附Python实现对比&#xff09; 在计算机视觉领域&#xff0c;模板匹配是一项基础而重要的技术。想象一下这样的场景&#xff1a;你正在开发一个工业质检系统&#xff0c;需要在流水线上快速识别产品上的特定标识&#…...

手把手教你用Wireshark抓包分析Opener EIP通信,快速定位ForwardOpen失败原因

深度解析EtherNet/IP通信&#xff1a;用Wireshark诊断ForwardOpen失败的实战指南 当你在MCU上成功移植了Opener协议栈&#xff0c;TCP连接建立正常&#xff0c;却在关键时刻遭遇ForwardOpen失败时&#xff0c;那种挫败感我深有体会。去年在汽车生产线控制系统项目中&#xff0c…...

RRT*算法进阶:从理论证明到PyTorch工程化调优与前沿探索

1. RRT*算法核心原理与数学证明 RRT*&#xff08;快速探索随机树星&#xff09;作为路径规划领域的里程碑算法&#xff0c;其核心价值在于同时满足概率完备性和渐进最优性。我第一次在仓储机器人项目中使用它时&#xff0c;发现传统RRT算法规划的路径总是像醉汉走路一样曲折&am…...