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

详解MySQL的MVCC机制

多版本并发控制(MVCC,Multi-Version Concurrency Control)是MySQL InnoDB存储引擎用于实现事务隔离和提高并发性能的一种机制。MVCC通过在同一数据的多个版本之间进行管理,允许读写操作并发进行,从而避免了传统锁机制带来的性能问题。以下是对MySQL MVCC机制的详细解释:

MVCC的基本原理

MVCC通过为每行数据维护多个版本来实现并发控制。在InnoDB中,每行数据都会有两个隐藏的列:

  1. trx_id:记录最后一次修改该行的事务ID。
  2. roll_pointer:指向该行的上一个版本,用于构建回滚链(undo log)。

此外,还有两个额外的列:

  • DB_ROW_ID:行ID,唯一标识一行数据。
  • DB_TRX_ID:事务ID,标识最近一次修改该行数据的事务。

MVCC的工作方式

MVCC主要依赖于快照读(Snapshot Read)和当前读(Current Read)来实现。

快照读(Snapshot Read)

快照读是读取数据的一个快照,通常是通过一致性非锁定读来实现的。快照读不会加锁,依赖于事务的版本控制来保证一致性。快照读的实现依赖于以下几个步骤:

  1. 事务启动:事务开始时,InnoDB会创建一个一致性视图(Consistent Read View),记录当前系统中活跃事务的ID。
  2. 读取数据:每次读取数据时,InnoDB会根据一致性视图判断数据行的版本是否对当前事务可见。
    • 如果数据行的trx_id小于事务的视图,则该行版本对当前事务可见。
    • 如果数据行的trx_id大于或等于事务的视图,则该行版本对当前事务不可见,InnoDB会沿着roll_pointer指向的回滚链找到对当前事务可见的版本。

当前读(Current Read)

当前读是读取数据的最新版本,并且会对读取的数据加锁,防止其他事务修改。当前读通常用于需要锁定读取数据的操作,如SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODEUPDATEDELETE等。

MVCC与事务隔离级别

MVCC在不同的事务隔离级别下表现不同:

  1. 读未提交(READ UNCOMMITTED)

    • 事务可以读取未提交的数据,不使用MVCC。
  2. 读已提交(READ COMMITTED)

    • 每次读取数据时,都使用最新的快照视图。即每个SELECT语句都会创建一个新的一致性视图。
  3. 可重复读(REPEATABLE READ)

    • 事务开始时创建一次一致性视图,整个事务期间使用同一个视图,确保同一事务内的多次读取结果一致。
  4. 串行化(SERIALIZABLE)

    • 事务间完全隔离,所有读取操作都会加锁,防止并发修改,不使用MVCC。

MVCC的优势

  1. 高并发性

    • 通过快照读避免了读写锁冲突,提高了并发性能。
  2. 一致性视图

    • 在可重复读隔离级别下,事务内多次读取数据保持一致,避免了不可重复读问题。
  3. 减少锁争用

    • 快照读不加锁,减少了锁争用,提高了系统性能。

MVCC的局限性

  1. 存储开销

    • 由于需要存储多个版本的数据,MVCC会增加存储空间的开销。
  2. 回滚链管理

    • 需要管理和维护回滚链,增加了系统的复杂性。
  3. 垃圾回收

    • 需要定期清理不再需要的旧版本数据,增加了系统的维护成本。

总结

MVCC通过维护数据的多个版本,实现了高效的并发控制和事务隔离。它在提高系统性能、减少锁争用方面具有显著优势,但也带来了存储开销和复杂性的问题。了解和合理使用MVCC对于优化MySQL数据库的性能和可靠性至关重要。

相关文章:

详解MySQL的MVCC机制

多版本并发控制(MVCC,Multi-Version Concurrency Control)是MySQL InnoDB存储引擎用于实现事务隔离和提高并发性能的一种机制。MVCC通过在同一数据的多个版本之间进行管理,允许读写操作并发进行,从而避免了传统锁机制带…...

docker部署skywalking

skywalking版本下载 1:拉取skywalking的oap镜像(可以选择自己的版本,最好与ui,agent版本一致) docker pull apache/skywalking-oap-server:9.5.02:启动oap docker run -d -p 11800:11800 -p 12800:12800 --name sw_oap apache/…...

Mac 使用Docker安装Elasticsearch、Kibana 、ik分词器、head

安装ElasticSearch 通过docker安装es docker pull elasticsearch:7.8.1 在本地创建elasticsearch.yml文件 mkdir /Users/ky/Documents/learn/es/elasticsearch.yml 编辑yml文件内容 http: host: 0.0.0.0 xpack.security.enabled: false xpack.security.enrollment.enabled: t…...

【Webpack4打包机制原理解析】

webpack是一个打包模块化 JavaScript 的工具,在 webpack里一切文件皆模块,通过 Loader 转换文件,通过 Plugin 注入钩子,最后输出由多个模块组合成的文件。webpack专注于构建模块化项目。 # 简单版打包模型步骤 我们先从简单的入手…...

如何提高接口响应速度

在非大数据(几万以上记录)的情况下,影响接口响应速度的因素中最大的是查询数据库的次数,其次才是数组遍历和简单数据处理(如根据已有字段增加新的属性,或计算值)。 一般一次数据库查询需要50毫秒…...

项目敏感配置信息加固

概述 引入jasypt做密码等敏感配置信息的加固 项目集成依赖 pom.xml引入jasypt-spring-boot-starter依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.…...

HCIA-AI课程大纲

该阶段详细介绍各个机器学习范式方法&#xff0c;涵盖有监督、无监督、半监督、强化学习&#xff0c;以及深度学习算法基础&#xff0c;共计 72 课时。 第一节&#xff1a;华为云 ModelArts 云服务开发环境搭建 - &#xff08;2 课时&#xff09; - 华为云 ModelArts 云服务简…...

keil program algorithm 出错

前段时间 在 调试下载算法时&#xff0c;遇到一个奇怪的问题 就是 加载下载算法后&#xff0c; 下载算法的RAM空间 大小不能修改为 单片机的最大RAM&#xff0c;只能改到最大4KB的空间大小, 再大就报错 刚开始报错 一直不知道原因&#xff0c;走了很多弯路&#xff0c; 到最…...

SITNE24V2BNQ-3/TR一种瞬态电压抑制器,对标PESD1CAN

SITNE24V2BNQ是一种瞬态电压抑制器&#xff0c;设计用于保护两个汽车控制器区域 网络(CAN)母线不受ESD等瞬变造成的损坏。 SITNE24V2BNQ采用SOT-23封装。标准产品不含铅和卤素。 产品参数 方向&#xff1a;双向通道数&#xff1a;2VRWM(V)(Max)&#xff1a;24IPP8/20μS(A)(M…...

Vue3【四】使用Vue2的写法写一个新的组件子组件和根组件

Vue3【四】使用Vue2的写法写一个新的组件 Vue3【四】使用Vue2的写法写一个新的组件 Vue3是向下兼容的&#xff0c;所有可以使用Vue的选项式写法 运行截图 目录结构 文件源码 App.vue <template><div class"app"><h1>你好世界! 我是App根组件<…...

指标体系建设10大坑

在企业经营和运营管理中&#xff0c;指标体系的建设至关重要&#xff0c;它在一定程度上是反映业务的问题状况&#xff0c;影响决策者的决策。但是&#xff0c;在指标体系的建设过程中&#xff0c;常常会存在一些不容忽视的“坑”&#xff0c;今天做个总结&#xff0c;以下为个…...

ubuntu 20.04上docker 使用gpu

要在Docker容器中使用GPU,你需要确保系统上已经安装了正确的NVIDIA驱动程序,并且安装了NVIDIA Container Toolkit。以下是详细的步骤: 1. 安装NVIDIA驱动程序 确保你的系统上已经安装了适当版本的NVIDIA驱动程序。你可以通过运行以下命令来检查驱动程序是否正确安装: nv…...

短剧系统投流版开发,为运营公司投流业务赋能

短剧系统投流版开发是一项复杂的任务&#xff0c;旨在为运营公司的投流业务提供强大的技术支持和赋能。以下是一些关键步骤和考虑因素&#xff0c;以确保短剧系统投流版的成功开发&#xff1a; 一、明确业务需求与目标 首先&#xff0c;需要深入了解运营公司的业务需求、目标…...

入坑必看的几个嵌入式方向热点问题

我们为何要学嵌入式&#xff1f;---需求、薪资、长期发展 嵌入式是成为下一个JAVA吗&#xff1f; 互联网开发和嵌入式开发怎么选&#xff1f; 高薪热门就业方向有哪些&#xff1f; 刚入门&#xff0c;刚毕业&#xff0c;学完没有“工作经验”&#xff0c;能有人要吗&#x…...

电能表如何与智能家居进行有效的融合

随着智能家居技术的不断发展&#xff0c;越来越多的家庭开始使用智能家电、智能照明、智能安防等智能设备&#xff0c;以实现更加便捷、舒适、安全的居住环境。而电能表作为电力系统中不可或缺的一环&#xff0c;不仅承担着计量电能的重要职责&#xff0c;还可以为智能家居系统…...

jmeter多用户登录并退出教程

有时候为了模拟更真实的场景&#xff0c;在项目中需要多用户登录并退出操作&#xff0c;大致参考如下 多用户登录前面已经实现&#xff1a;参考博文 多用户登录并退出jmx文件&#xff1a;百度网盘 提取码&#xff1a;0000 一、多用户退出操作 添加一个setUp线程组&#xff0…...

阿里云ECS实例镜像本地取证

更新时间&#xff1a;2024年03月21日10:09:37 1. 说明 很多非法案件中&#xff0c;服务器是直接搭建在阿里云上的&#xff0c;比如我们在拿到OSSKey之后&#xff08;技术方法、其它方法等&#xff09;&#xff0c;可以将涉案服务器镜像导出&#xff0c;在本地进行取证分析。 …...

不要硬来!班组管理有“巧思”

班组管理&#xff0c;听起来似乎是一个充满“硬气”的词汇&#xff0c;让人联想到严肃、刻板的制度和规矩。然而&#xff0c;在实际操作中&#xff0c;我们却需要运用一些“巧思”&#xff0c;以柔克刚&#xff0c;让班组管理既有力度又不失温度。 在班组管理中&#xff0c;我们…...

[原创][Delphi多线程]使用TMonitor和TQueue配合实现TThreadedQueue的经典使用案例.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delph…...

vue3 基于el-tree增加、删除节点(非TypeScript 写法)

话不多说&#xff0c;直接贴代码 <template><div class"custom-tree-container"><!-- <p>Using render-content</p><el-tree style"max-width: 600px" :data"dataSource" show-checkbox node-key"id" …...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...