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

MVCC 原理与并发控制实现

MVCC 原理与并发控制实现

1. MVCC 基本概念

MVCC(Multi-Version Concurrency Control,多版本并发控制)是现代数据库系统中实现并发控制的核心技术之一。与传统的锁机制不同,MVCC通过维护数据的多个版本来实现非阻塞读取。

关键结论:MVCC的核心思想是通过数据多版本来实现读不阻塞写、写不阻塞读的并发控制
golang专栏:https://duoke360.com/tutorial/path/golang

2. MVCC 核心原理

2.1 版本链机制

每个数据行会维护一个版本链,包含:

  • 事务ID(Transaction ID):标识创建该版本的事务
  • 回滚指针(Roll Pointer):指向旧版本数据的指针
  • 删除标记(Delete Flag):标记该版本是否已被删除
+---------+---------+---------+
| 版本3   | 版本2   | 版本1   |
| TxID=103| TxID=102| TxID=101|
+---------+---------+---------+

2.2 快照读(Snapshot Read)

MVCC通过快照隔离(Snapshot Isolation)实现一致性读:

  1. 每个事务开始时获取当前活跃事务列表
  2. 读取时只能看到:
    • 已提交的事务修改
    • 本事务自身的修改
  3. 忽略未提交事务和本事务开始后提交的事务修改

2.3 可见性判断规则

数据库通过以下规则判断数据版本对当前事务是否可见:

  1. 版本创建事务ID < 当前事务ID
  2. 版本创建事务已提交
  3. 版本创建事务不在当前事务的快照活跃事务列表中

3. MVCC 实现细节

3.1 InnoDB 的 MVCC 实现

MySQL InnoDB引擎中MVCC的具体实现:

  • 隐藏字段

    • DB_TRX_ID:6字节,最后修改该行的事务ID
    • DB_ROLL_PTR:7字节,回滚指针
    • DB_ROW_ID:6字节,隐藏的行ID
  • Undo Log

    • 存储数据修改前的旧版本
    • 构成版本链的基础
  • ReadView

    • m_ids:生成ReadView时活跃的事务ID列表
    • min_trx_id:m_ids中的最小值
    • max_trx_id:下一个将分配的事务ID
    • creator_trx_id:创建该ReadView的事务ID

3.2 PostgreSQL 的 MVCC 实现

PostgreSQL采用略有不同的实现方式:

  • Tuple Visibility

    • xmin:插入该元组的事务ID
    • xmax:删除/锁定该元组的事务ID
    • ctid:元组物理位置
  • Vacuum机制

    • 定期清理不再需要的旧版本
    • 防止事务ID回卷问题

4. MVCC 的并发控制优势

关键优势:MVCC相比锁机制显著提高了系统的并发性能

  1. 读不阻塞写:读取操作不需要获取锁
  2. 写不阻塞读:写入操作不会阻塞读取旧版本
  3. 避免死锁:减少了锁竞争场景
  4. 一致性读:事务看到的是一致的快照

5. MVCC 的局限性

5.1 写冲突问题

MVCC无法完全避免写-写冲突

  • 多个事务同时修改同一数据时仍需锁机制
  • 常见解决方案:乐观锁或悲观锁

5.2 存储开销

  • 需要维护多个数据版本
  • Undo log增长可能导致存储压力

5.3 长事务问题

  • 长时间运行的事务会阻止旧版本数据清理
  • 可能导致版本链过长影响性能

6. MVCC 与隔离级别

不同隔离级别下MVCC的行为差异:

隔离级别MVCC行为特点
读未提交不使用MVCC,直接读取最新数据
读已提交每次读取都生成新的ReadView
可重复读事务开始时生成ReadView并保持
串行化通常退化为锁机制

注意:不同数据库实现可能有差异,如Oracle的读已提交也支持一致性读

7. 面试常见问题

7.1 MVCC如何解决幻读问题?

可重复读隔离级别下:

  • 通过快照读避免看到其他事务新插入的数据
  • 但当前事务自身的修改仍可能导致幻读
  • InnoDB通过间隙锁补充解决

7.2 MVCC中的版本何时被清理?

当满足以下条件时版本可以被清理:

  1. 没有活跃事务需要访问该版本
  2. 版本对应的事务已提交
  3. 该版本不是当前最新版本

7.3 为什么需要Undo Log?

Undo Log在MVCC中扮演关键角色:

  1. 存储数据旧版本实现版本链
  2. 支持事务回滚
  3. 实现一致性读

8. 实际应用建议

  1. 合理设置事务隔离级别:根据业务需求选择
  2. 控制事务长度:避免长事务导致版本堆积
  3. 监控Undo Log:防止空间耗尽
  4. 定期维护:执行VACUUM(PostgreSQL)或purge(InnoDB)

最佳实践:理解MVCC原理有助于设计高性能数据库应用,但也要注意其局限性

通过深入理解MVCC机制,开发者可以更好地优化数据库访问模式,构建高并发的数据密集型应用。在面试中,结合具体数据库实现和实际案例讲解MVCC,会展现更深入的技术理解。

相关文章:

MVCC 原理与并发控制实现

MVCC 原理与并发控制实现 1. MVCC 基本概念 MVCC(Multi-Version Concurrency Control&#xff0c;多版本并发控制)是现代数据库系统中实现并发控制的核心技术之一。与传统的锁机制不同&#xff0c;MVCC通过维护数据的多个版本来实现非阻塞读取。 关键结论&#xff1a;MVCC的核…...

CentOS 7.0重置root密码

文章目录 版本&#xff1a;CentOS 7.0内核版本&#xff1a;CentOS Linux, with Linux 3.10.0-123.el7.x86_64 服务器重启后&#xff0c;等待进入上述页面&#xff0c;按⬆⬇键&#xff0c;中断正常启动。在此页面按E&#xff0c;进入编辑模式 继续按⬇&#xff0c;找到linux16…...

YOLOV11改进策略【最新注意力机制】CVPR2025局部区域注意力机制LRSA-增强局部区域特征之间的交互

1.1网络结构 1.2 添加过程 1.2.1 核心代码 import torch import torch.nn as nn import torch.nn.functional as F from einops import rearrangedef patch_divide(x, step, ps):"""Crop image into patches.Args:x (Tensor): Input feature map of shape(b, …...

3D建模的全景图谱:从55个工具到元宇宙的数字革命

3D建模已从专业工程师的工具箱演变为全民创作的数字语言。从代码驱动的精确建模到AI自动生成纹理&#xff0c;从开源协作到程序化生成城市&#xff0c;技术正重塑我们创造虚拟世界的方式。本文将系统解析55个核心3D建模工具/插件&#xff0c;涵盖在线编辑器、开源软件、程序化生…...

Kotlin 活动事件通讯跳转深度讲解

在 Android 开发的浩瀚海洋中,活动(Activity)间的事件通讯与跳转犹如构建复杂应用程序的桥梁与纽带,而 Kotlin 语言的加入,更是为这一过程注入了简洁、优雅与高效的活力。本文将深入剖析 Kotlin 开发中安卓活动事件通讯跳转的方方面面,从基础概念到高级技巧,从代码示例到…...

vue + ant-design + xlsx 实现Excel多Sheet页导出功能

Vue Ant Design 扩展&#xff1a;实现Excel多Sheet页导出功能 引言 在复杂业务场景中&#xff0c;单一Sheet页已无法满足数据展示需求。本文将演示如何基于Vue3 Ant Design Vue xlsx技术栈&#xff0c;实现以下高级导出功能&#xff1a; 动态多Sheet页生成复杂数据集关联…...

关于 Web 安全:6. 常见 CMS 开源系统风险点

一、WordPress 开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;使用 PHP MySQL 构建&#xff1b; 全球超过 40% 网站使用&#xff1b; 支持插件、主题系统&#xff0c;功能可扩展性极强&#xff1b; 也是风险点最多的系统之一&#xff0c;插件/主题贡献了大部分…...

DAY33 简单神经网络

你需要自行了解下MLP的概念。 你需要知道 梯度下降的思想激活函数的作用损失函数的作用优化器神经网络的概念 神经网络由于内部比较灵活&#xff0c;所以封装的比较浅&#xff0c;可以对模型做非常多的改进&#xff0c;而不像机器学习三行代码固定。 1. 神经网络的概念 (Th…...

OBOO鸥柏丨2025年鸿蒙生态+国产操作系统触摸屏查询一体机核心股

在信创产业蓬勃发展的当下&#xff0c;OBOO鸥柏积极响应纯国产化号召&#xff0c;推出基于华为鸿蒙HarmonyOS操作系统的触摸屏查询一体机及室内外场景广告液晶显示屏一体机上市&#xff0c;OBOO鸥柏品牌旗下显示产品均采用国产芯片&#xff0c;接入终端控制端需支持安卓Windows…...

【观成科技】Ymir勒索软件组织窃密木马RustyStealer加密通信分析

1.概述 Ymir勒索软件首次发现于2024年7月&#xff0c;采用ChaCha20加密算法对受害者文件进行加密&#xff0c;加密文件后缀为.6C5oy2dVr6。在攻击过程中&#xff0c;Ymir勒索组织利用名为RustyStealer的窃密木马获取受害企业的账号凭证&#xff0c;为后续横向移动和权限提升奠…...

Vuer开源程序 是一个轻量级的可视化工具包,用于与动态 3D 和机器人数据进行交互。它支持 VR 和 AR,可以在移动设备上运行。

​一、软件介绍 文末提供程序和源码下载 Vuer开源程序 是一个轻量级的可视化工具包&#xff0c;用于与动态 3D 和机器人数据进行交互。它支持 VR 和 AR&#xff0c;可以在移动设备上运行。 二、Our features include: 我们的功能包括&#xff1a; light-weight and performa…...

浅谈学习(费曼学习法)

我们在学习的过程中常常会面临遗忘的问题。 欸&#xff0c;之前明明学过&#xff0c;怎么感觉模模糊糊的&#xff0c;忘记了&#xff0c;当然。。。有可能是因为当时就没有听懂。 但是我经常会有一种情况&#xff0c;我觉得自己当时明明听懂了&#xff0c;理解了呀&#xff0…...

高光谱成像相机:表型技术在林业育种和精确林业的应用

在林木育种和精确林业管理中&#xff0c;表型数据的精准获取与分析是破解基因型-环境-表型互作关系的关键。传统人工测量方式存在效率低、维度单一、破坏性强等局限&#xff0c;而高光谱成像技术凭借其多波段、高分辨率和非接触式的优势&#xff0c;成为林业表型研究的重要工具…...

iOS App启动优化(冷启动、热启动)

App启动优化是提升用户体验的关键环节&#xff0c;主要针对冷启动和热启动进行针对性优化。 冷启动与热启动的定义 冷启动&#xff08;Cold Launch&#xff09; 场景&#xff1a;App进程不存在&#xff0c;需系统创建新进程并完成完整初始化&#xff08;如首次启动或进程被杀死…...

短视频一键搬运 v1.7.1|短视频无水印下载 一键去重

短视频一键搬运是一款全自动智能处理软件&#xff0c;专为短视频创作者设计。它自带去水印、改MD5码、视频去重、视频编辑等功能&#xff0c;能够高效处理大量视频&#xff0c;解放双手并降低成本。该软件支持从多个短视频平台无缝提取视频并去除水印&#xff0c;同时检测敏感词…...

海上石油钻井平台人员安全管控解决方案

一、行业挑战与需求分析 海上钻井平台面临复杂环境风险&#xff08;如易燃易爆、金属干扰、极端气象&#xff09;和人员管理难题&#xff08;如定位模糊、应急响应延迟&#xff09;。传统RFID或蓝牙定位技术存在精度不足&#xff08;1-5米&#xff09;、抗干扰能力差等问题&am…...

(25年5.28)ChatGPT Plus充值教程与实用指南:附国内外使用案例与模型排行

更多具体来源&#xff1a;查看原文 ChatGPT Plus 充值教程 由于国内卡无法直接充值 chatgpt&#xff0c;通常需要借助虚拟卡。目前咱们常用的方式是通过虚拟卡平台获取。因平台审核要求这里不细说&#xff0c;具体看原文。 ChatGPT Plus主要使用方向 ChatGPT Plus 提供了更…...

“以光惠算”走进校园,湖北大学用F5G-A全光网赋能智慧校园

SUN的联合创始人约翰盖奇&#xff0c;曾在1984年提出过一个大胆的猜想——“网络就是计算机”。 到了大模型时代&#xff0c;40多年前的猜想被赋予了新的内涵。大模型训练和推理所需的资源&#xff0c;远超单台计算机的承载能力&#xff0c;涌现出了新的网络范式&#xff1a;大…...

stm32cube ide如何生成LL库工程

在 STM32Cube IDE 里生成使用 LL&#xff08;Low Layer&#xff09;库的工程&#xff0c;可按以下步骤操作&#xff1a; 1. 新建 STM32 工程 启动 STM32Cube IDE&#xff0c;选择File→New→STM32 Project。依据需求挑选目标 MCU 型号&#xff0c;接着点击Next。 2. 配置工程…...

TEASER-plusplu Windows Mingw编译

编译记录&#xff1a; 1.下载该库 v2.0 链接1&#xff1a;https://github.com/MIT-SPARK/TEASER-plusplus 连接2&#xff1a;https://github.com/MIT-SPARK/TEASER-plusplus/releases 2.下载 googletest 链接&#xff1a;https://github.com/google/googletest/releases?page2…...

T5和GPT哪个更强大

一图速览&#xff1a;T5 vs GPT 对比总结 维度T5&#xff08;Text-to-Text Transfer Transformer&#xff09;GPT&#xff08;Generative Pretrained Transformer&#xff09;&#x1f4cc; 模型类型编码器-解码器&#xff08;Encoder-Decoder&#xff09;解码器-only&#xf…...

tryhackme——Data Exfiltration

文章目录 一、网络拓扑二、数据泄露分类2.1 传统数据泄露2.2 C2通信2.3 隧道 三、隧道3.1 Exfiltration using TCP socket3.2 Exfiltration using SSH3.3 Exfiltrate using HTTP(S)HTTP隧道 3.4 Exfiltration using ICMP3.4.1 ICMP数据包结构3.4.2 MSF实现ICMP数据泄露3.4.3 IC…...

阿里云服务器采用crontab定时任务使acme.sh全自动化申请续签免费SSL证书,并部署在Linux宝塔网站和雷池WAF

阿里云服务器安装Linux宝塔面板用于部署网站&#xff0c;又安装了雷池WAF用于防护网站&#xff0c;网站访问正常。可以参考文章&#xff1a;Linux服务器安装Linux宝塔面板并部署wordpress网站以及雷池WAF 本文介绍使用 acme.sh 通过 DNS API 全自动申请和续签免费Let’s Encry…...

day40 python图像数据与显存

目录 一、图像数据的处理与预处理 &#xff08;一&#xff09;图像数据的特点 &#xff08;二&#xff09;数据预处理 二、神经网络模型的定义 &#xff08;一&#xff09;黑白图像模型的定义 &#xff08;二&#xff09;彩色图像模型的定义 &#xff08;三&#xff09;…...

Python+VR:如何让虚拟世界更懂你?——用户行为分析的实践

友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…...

【华为鸿蒙电脑】首款鸿蒙电脑发布:MateBook Fold 非凡大师 MateBook Pro,擎云星河计划启动

文章目录 前言一、HUAWEI MateBook Fold 非凡大师&#xff08;一&#xff09;非凡设计&#xff08;二&#xff09;非凡显示&#xff08;三&#xff09;非凡科技&#xff08;四&#xff09;非凡系统&#xff08;五&#xff09;非凡体验 二、HUAWEI MateBook Pro三、预热&#xf…...

性能优化深度实践:突破vue应用性能

一、性能优化深度实践&#xff1a;突破 Vue 应用性能边界 1. 虚拟 DOM 性能边界分析 核心原理&#xff1a; 虚拟 DOM 是 Vue 的核心优化策略&#xff0c;通过 JS 对象描述真实 DOM 结构。当状态变化时&#xff1a; 生成新虚拟 DOM 树Diff 算法对比新旧树差异仅更新变化的真实…...

服务器定时任务查看和编辑

在 Ubuntu 系统中&#xff0c;查看当前系统中已开启的定时任务主要有以下几种方式&#xff0c;分别针对不同类型的定时任务管理方式&#xff08;如 crontab、systemd timer 等&#xff09;&#xff1a; 查看服务器定时任务 一、查看用户级别的 Crontab 任务 每个用户都可以配…...

SpringBoot Controller接收参数方式, @RequestMapping

一. 通过原始的HttpServletRequest对象获取请求参数 二. 通过Spring提供的RequestParam注解&#xff0c;将请求参数绑定给方法参数 三. 如果请求参数名与形参变量名相同&#xff0c;直接定义方法形参即可接收。(省略RequestParam) 四. JSON格式的请求参数(POST、PUT) 主要在PO…...

double怎么在c/c++中输出保留输出最小精度为一位

在C中&#xff0c;使用std::cout输出double类型时&#xff0c;可以通过<iomanip>头文件中的std::fixed和std::setprecision来控制小数位数的输出。以下是几种常见场景的解决方案&#xff1a; ​​1. 输出至少1位小数&#xff08;不足补零&#xff09;​​ #include <…...