2025年精通MVCC
今年找工作,无一例外又问到了MVCC这个知识点。几乎每次换工作都会被问到这个面试有用,工作毫无 * 用的知识。但是环境就是这样,既然如此,我们用一篇文章彻底搞懂MVCC
1.MVCC是什么
MVCC(Multi-Version Concurrency Control,多版本并发控制) 是数据库中常用的一种 并发控制机制,它通过为每个事务提供数据的多个版本,实现了 读写分离、读不加锁,大幅提升数据库并发性能。
也就是说,它是为了解决当出现多个线程访问数据库时出现的一些问题。那么首先先搞清楚有哪些问题,再说解决方案。
2解决了什么问题
2.1 用锁来实现事务的效率问题
如果没有MVCC,那么想实现事务只能加读锁和写锁了,首先写锁是肯定要加的,不能A操作一个数据时,B也能操作同一个数据吧。且A操作一个数据时,B也不能读,因为没有MVCC,你这时候去读就能读到A操作的中间态数据。就像五我才写了一横,你就直接读了,你以为我写的是一。既然事务是必须要实现的,不管你是用锁,还是MVCC。那么我们来思考如何不用锁,也能实现事务。
这里提到事务的隔离级别:
READ UNCOMITTED:读未提交
READ COMMITTED:读提交
REPEATABLE READ:可重复读
SERIALIZABLE:串行化
上文提到,如果连锁都不用,属于读未提交,能读到其他事务的中间态(事务未提交的数据),那也没什么隔离可说了。MySQL既然是事务型数据库,读未提交就不需要讨论(某些业务场景需要获取到未提交的数据状态时,可以将隔离级别设为读未提交,比如输出一些状态日志。)。
串行化就等于加读写锁,没有MVCC又要保证事务那就是这个级别,但是效率又太低。那么这时候MVCC来了。它通过判断trx_id的大小决定哪些数据对我可见,那么别人写的时候,我就可以通过这个判定依据决定我可以看见哪个版本下的数据了,我就不会读到脏数据,也就不需要加锁,也就实现了多版本并发控制。
2.2 脏读问题
首先要明确,读到别人未提交的数据,就是脏读,那自然可以知道READ COMMITTED:读提交,这个隔离级别是可以阻止脏读的。那如何实现读提交隔离级别呢?
那么MVCC来了。
当事务 T 读取数据时,对于某一行记录的版本 trx_id
(事务ID):
-
如果
trx_id
< 当前Read View
中的最小活跃事务ID ⇒ 可见(早已提交) -
如果
trx_id
是正在进行中的事务 ⇒ 不可见 -
如果
trx_id
== 当前事务ID ⇒ 可见(自己写的可见) -
否则,根据
undo log
找前一版本,继续判断。
说人话就是,当你去查询某一行数据时,这一行数据有一个历史记录列表(undo log实现,且列表每一行都有一个trx_id)。你去对比这个历史记录列表,现在活跃事务id中有10个是活跃的,事务id是自增的,你找到最小的活跃事务id,然后你能看见的数据就是历史记录列表中trx_id小于最小活跃事务id的记录数据。也就是你只能看见已经提交,不处于活跃状态的数据。
也就是说,数据库是通过对比trx_id,来控制判断哪些已操作完成的数据你可以看见,正在操作的数据你不可以看见。
那么就引出了最常见的面试核心内容:
InnoDB 如何实现 MVCC?
InnoDB 在行级存储和事务控制的基础上,通过以下机制实现 MVCC:
1. 每行记录隐含两个字段:
字段名 含义 trx_id
最后修改该行的事务ID roll_pointer
(或称roll_ptr
)指向旧版本数据的指针(Undo Log) 2. 使用 Undo Log(回滚日志)保存历史版本
每次对数据的更新/删除操作都会记录旧版本到 Undo Log;
读取操作会根据当前事务的 Read View,从 Undo Log 中找到合适的版本供事务“读取”。
3. Read View(读取快照)
每个事务在执行
SELECT
时,会创建一个 Read View;这个视图记录了哪些事务“对我来说是不可见的”,以此决定读取哪个版本。
2.3 不可重复读
我们知道MVCC工作在:
READ COMMITTED:读提交
REPEATABLE READ:可重复读
两个级别下,READ COMMITTED是有不可重复读的问题的,同一个事务内,如果其他事务提交了数据,我是能感知到的。那么解决不可重复读问题,就是采用默认的REPEATABLE READ:可重复读隔离级别。就是采用同一个事务中,始终只访问第一次select时的Read View快照(读取快照)。
3 如何实现
那么记住核心的内容:
采用每一行记录trx_id来对比大小,判定可见区域。
采用roll_pointer来寻找上一条旧数据,链式寻找,也就是Undo Log一个最大的作用。
采用Read View读快照来保存历史数据。
最后,记住MVCC的实现,以及读提交,可重复读这两个隔离级别不能避免幻读问题。这个关于间隙锁,后面说。
相关文章:
2025年精通MVCC
今年找工作,无一例外又问到了MVCC这个知识点。几乎每次换工作都会被问到这个面试有用,工作毫无 * 用的知识。但是环境就是这样,既然如此,我们用一篇文章彻底搞懂MVCC 1.MVCC是什么 MVCC(Multi-Version Concurrency C…...
硬路由与软路由
目录 核心区别 ⚙️ 性能与功能定位 如何选择? 核心区别 硬路由: 本质: 专用的硬件设备。构成: 厂家将特定的路由器操作系统(通常是高度定制化、封闭或精简的)固化在专用的硬件平台上。硬件:…...

OpenCV C++ 心形雨动画
❤️ OpenCV C 心形雨动画 ❤️ 本文将引导你使用 C 和 OpenCV 库创建一个可爱的心形雨动画。在这个动画中,心形会从屏幕顶部的随机位置落下,模拟下雨的效果。使用opencv定制自己的专属背景 目录 简介先决条件核心概念实现步骤 创建项目定义心形结构…...

Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结
Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结 上一篇笔记:Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理 目前上来说,这个系列的笔记本质上来说,是对不理解的知识点进行的一个梳理&…...

安卓Compose实现鱼骨加载中效果
安卓Compose实现鱼骨加载中效果 文章目录 安卓Compose实现鱼骨加载中效果背景与简介适用场景Compose骨架屏与传统View实现对比Shimmer动画原理简介常见问题与优化建议参考资料 本文首发地址 https://h89.cn/archives/404.html 背景与简介 在移动应用开发中,加载中占…...
使用qt 定义全局钩子 捕获系统的键盘事件
使用qt 定义全局钩子 捕获系统的键盘事件 即使焦点不在自定义软件上,也能够触发 以下待接口代码: class Hook :public QObject { Q_OBJECT public: Hook(); enum Type { CTRL_E, CTRL_W, SPACE, Enter, C };//自定义枚举,定义“修改”、“撤回…...
FreeType 字体信息检查工具 - 现代C++实现
文章目录 获取字体的版权信息工具简介主要特点1. 现代C实现2. 完整的功能3. 健壮的错误处理4. 国际化支持 使用说明技术亮点 获取字体的版权信息 #include <iostream> // 标准输入输出流库 #include <string> // 字符串处理库 #include <vector>…...
el-table 树形数据,子行数据可以异步加载
1、 <el-tableborder:header-cell-style"tableStyle?.headerCellStyle"ref"tableRef":data"tableData"row-key"id":default-expand-all"false" // 默认不展开所有树形节点:tree-props"{ children: children, hasC…...

【使用JAVA调用deepseek】实现自能回复
在Spring Boot系统中接入DeepSeek服务,并将其提供给用户使用,通常需要以下步骤: 一、准备工作 (1)注册DeepSeek开发者账号 访问DeepSeek官网,注册并创建应用,获取API Key。 API文档࿱…...

【Linux系列】rsync命令详解与实践
博客目录 高效文件同步的艺术:rsync 命令详解与实践rsync 命令解析rsync 的核心优势1. 增量传输:效率的革命2. 归档模式(-a):保留文件所有属性3. 人性化输出(-h)与进度显示(--progress) 实际应用场景1. 文件备份与版本管理2. 跨设备同步3. 大…...

Windows系统工具:WinToolsPlus 之 SQL Server Suspect/质疑/置疑/可疑/单用户等 修复
数据库在数据库列表状态是 Suspect/质疑/置疑/可疑/单用户等 非正常状态时, 使用WinToolsPlus 数据库页签 先设置 数据源 , 选择 需要清理日志的数据库, 点击 Suspect/质疑/置疑/可疑/单用户 按钮即可进修复。 修复过程会有数据库服务停止和启…...

C++——智能指针 unique_ptr
unique_ptr的实现原理:简单粗暴的防拷贝 目录 一、使用C11中的新用法unique_ptr 二、使用c11模拟实现 三、使用c98特性实现 四、模拟实现unique_ptr 五、发现问题 一、使用C11中的新用法unique_ptr 由于限制了拷贝以及赋值 导致缺陷:unique_ptr管理…...

【Python训练营打卡】day43 @浙大疏锦行
DAY 43 复习日 作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 我选择的是music_instruments 链接:Musical Instruments (kaggle.com) #导包 import torch import torch.nn as…...

1-【源码剖析】kafka核心概念
从今天开始开始在csdn上记录学习的笔记,主要包括以下几个方面: kafkaflinkdoris 本系列笔记主要记录Kafka学习相关的内容。在进行kafka源码学习之前,先介绍一下Kafka的核心概念。 消息 消息是kafka中最基本的数据单元,由key和…...
JavaScript中判断两个对象是否相同(所有属性的值是否都相同)
在JavaScript中,判断两个对象的所有属性是否相同(包括嵌套对象)需要深度比较(deep comparison)。以下是几种实现方法: 方法1:简易深度比较(不考虑循环引用、Symbol和特殊对象&#x…...
Flask 应用的生产环境部署指南
Flask 是一个轻量级的 Python Web 应用框架,常用于快速开发 Web 应用或 API。然而,Flask 内置的开发服务器仅适用于开发和调试阶段,并不适合直接用于生产环境。本文将详细介绍在生产环境中部署 Flask 应用的最佳实践,包括使用专业…...

思科设备网络实验
一、 总体拓扑图 图 1 总体拓扑图 二、 IP地址规划 表格 1 接口地址规划 设备名称 接口/VLAN IP 功能 PC0 VLAN580 10.80.1.1 访问外网 PC1 VLAN581 10.80.2.1 访问外网 PC2 Fa0 20.80.1.100 端口镜像监控流量 PC3 VLAN585 10.80.6.1 远程登陆多层交换机0…...
Oracle OCP与MySQL OCP认证如何选?
认证本质与定位差异 Oracle OCP Oracle OCP是Oracle公司推出的旗舰级数据库专家认证,专注于其核心的闭源商业数据库技术体系。核心领域包括RAC(Real Application Clusters)高可用集群、Data Guard容灾解决方案、Exadata数据库一体机集成以及…...

AWS之数据分析
目录 数据分析产品对比 1. Amazon Athena 3. AWS Lake Formation 4. AWS Glue 5. Amazon OpenSearch Service 6. Amazon Kinesis Data Analytics 7. Amazon Redshift 8.Amazon Redshift Spectrum 搜索服务对比 核心功能与定位对比 适用场景 关键差异总结 注意事项 …...

C# Onnx 动漫人物头部检测
目录 效果 模型信息 项目 代码 下载 参考 效果 模型信息 Model Properties ------------------------- date:2024-10-19T12:32:20.920471 description:Ultralytics best model trained on /root/datasets/yolo/anime_head_detection/data.yaml au…...

【Ragflow】24.Ragflow-plus开发日志:增加分词逻辑,修复关键词检索失效问题
概述 在RagflowPlus v0.3.0 版本推出之后,反馈比较多的问题是:检索时,召回块显著变少了。 如上图所示,进行检索测试时,关键词相似度得分为0,导致混合相似度(加权相加得到)也被大幅拉低,低于设定…...
gin 常见中间件配置
这里主要配置 请求日志中间件、跨域中间件、trace_id 中间件、安全头中间件 一般来说,这个中间件的信息 就是放在 middlewares/* 里面的*.go 进行操作 ➜ middlewares git:(main) tree . ├── cors.go ├── logging.go ├── request_id.go └── securit…...
蚂蚁森林自动收能量助手:Ant_Forest_1_5_4_3绿色行动新选择
先放软件下载链接:夸克网盘下载 便捷助力绿色生活:蚂蚁森林收能量脚本_Ant_Forest_1_5_4_3 在倡导绿色环保的当下,蚂蚁森林成为众多用户践行低碳生活的热门平台。而蚂蚁森林收能量脚本_Ant_Forest_1_5_4_3 这款软件,为用户在蚂蚁森林的体验…...

Zookeeper 集群部署与故障转移
Zookeeper 介绍 Zookeeper 是一个开源的分布式协调服务,由Apache基金会维护,专为分布式应用提供高可用、强一致性的核心基础能力。它通过简单的树形命名空间(称为ZNode树)存储数据节点(ZNode),…...

Redis最佳实践——电商应用的性能监控与告警体系设计详解
Redis 在电商应用的性能监控与告警体系设计 一、原子级监控指标深度拆解 1. 内存维度监控 核心指标: # 实时内存组成分析(单位字节) used_memory: 物理内存总量 used_memory_dataset: 数据集占用量 used_memory_overhead: 管理开销内存 us…...

区域徘徊检测算法AI智能分析网关V4助力公共场所/工厂等多场景安全升级
一、项目背景 随着数字化安全管理需求激增,重点场所急需强化人员异常行为监测。区域徘徊作为潜在安全威胁的早期征兆,例如校园围墙外的陌生逗留者,都可能引发安全隐患。传统人工监控模式效率低、易疏漏,AI智能分析网关V4的区域徘…...

修复与升级suse linux
suse linux enterprise desktop 10提示:xxx service failed when loaded shared lib . error ibgobject.so.2.0:no such file or directory. suse linux enterprise server 12.iso 通过第一启动项引导,按照如下方式直接升级解决。...

电力高空作业安全检测(2)数据集构建
数据集构建的重要性 在电力高空作业安全检测领域,利用 计算机视觉技术 进行安全监测需要大量的图像数据,这些数据需要准确标注不同的安全设备与作业人员行为。只有构建出包含真实场景的高质量数据集,才能通过深度学习等算法对高空作业中的潜…...

嵌入式开发之STM32学习笔记day18
STM32F103C8T6 SPI通信读写W25Q64 1 W25Q64简介 W25Qxx系列是一种低成本、小型化且易于使用的非易失性存储器(NOR Flash),它广泛应用于需要持久化存储数据的各种场景,如数据存储、字库存储以及固件程序存储等。该系列存储器采用…...

[论文阅读]PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning
PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning | IJCAI IJCAI-22 发表于2022年的论文,当时大家还都在做小模型NLP的相关工作(BERT,Ro…...