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

MVCC(多版本并发控制)机制讲解

MVCC(Multi-Version Concurrency Control,多版本并发控制)这是一个在数据库管理系统中非常重要的技术,尤其是在处理并发事务时。别担心,我会用简单易懂的方式来讲解,让你轻松掌握它的原理和作用。


1. 什么是MVCC?

定义

MVCC是一种数据库技术,用于通过保留数据的多个版本来提高并发性能,同时避免事务之间的冲突。简单来说,它允许数据库在读取和写入操作时,同时存在多个版本的数据,而不是直接修改原始数据。

举个例子

想象一下,你有一本书,书中的内容是“今天天气很好”。现在,你的朋友想在书上写“今天天气很好,适合出去玩”,但他不想直接在你的书上修改,而是想保留原来的版本。于是,他拿了一张纸,在上面写上新的内容,并标注这是第2个版本。这样,你的原始版本和新的版本都可以保留下来。这就是MVCC的基本思想。


2. MVCC的工作原理

核心思想

MVCC的核心思想是:每次修改数据时,不直接覆盖原始数据,而是创建一个新的版本。这样,旧版本的数据仍然可以被其他事务访问,而不会被新的修改影响。

如何实现?

  • 版本号:每次修改数据时,系统会为新版本分配一个唯一的版本号(通常是时间戳或递增的数字)。

  • 快照读:当一个事务读取数据时,它会看到一个“快照”——即在事务开始时数据库的状态。这个快照是通过版本号来确定的。

  • 写操作:当一个事务修改数据时,它会创建一个新的版本,并标记这个版本的版本号。旧版本的数据仍然保留,直到没有事务需要它为止。

举个例子

假设数据库中有以下记录:

复制

ID | Name    | Version
1  | Alice   | 1

现在,事务A读取了这条记录,看到的版本是1。与此同时,事务B修改了这条记录,将Name改为Bob。此时,数据库会创建一个新的版本:

复制

ID | Name    | Version
1  | Alice   | 1
1  | Bob     | 2

事务A仍然可以看到Alice(版本1),而事务B可以看到Bob(版本2)。当事务A完成时,数据库会清理掉旧版本的数据,但事务B仍然可以看到新版本。


3. MVCC的优势

提高并发性能

  • 读操作不阻塞写操作:由于读操作访问的是数据的旧版本,写操作不会影响读操作,从而减少了锁的使用。

  • 写操作不阻塞读操作:即使有写操作正在进行,读操作仍然可以访问旧版本的数据,而不会被阻塞。

避免锁冲突

  • 减少锁的使用:MVCC通过版本控制减少了对锁的需求,从而降低了锁冲突的可能性。

  • 提高事务吞吐量:由于减少了锁的使用,事务可以更快地完成,提高了系统的整体吞吐量。


4. MVCC的实现细节

版本号

  • 版本号的作用:每个版本的数据都有一个唯一的版本号,用于标识数据的创建时间和顺序。

  • 如何使用版本号:当事务读取数据时,它会根据自己的开始时间选择一个合适的版本号,从而看到一个一致的快照。

快照读

  • 快照的概念:事务开始时,数据库会创建一个快照,记录当前所有版本的数据。

  • 如何读取快照:事务读取数据时,会根据快照中的版本号选择数据,而不是直接读取最新的数据。

垃圾回收

  • 旧版本的清理:随着时间推移,旧版本的数据可能会堆积。数据库需要定期清理这些旧版本,以节省空间。

  • 清理条件:只有当没有事务需要旧版本时,数据库才会清理这些版本。


5. MVCC的应用场景

数据库系统

  • MySQL:MySQL的InnoDB存储引擎使用MVCC来实现事务的隔离级别,如READ COMMITTEDREPEATABLE READ

  • PostgreSQL:PostgreSQL也使用MVCC来管理事务并发,支持高并发的读写操作。

  • SQLite:SQLite在某些模式下也支持MVCC,用于提高并发性能。

分布式系统

  • Cassandra:Cassandra使用MVCC来处理分布式环境下的并发读写操作。

  • 其他NoSQL数据库:许多NoSQL数据库也借鉴了MVCC的思想,以提高系统的并发性能。


6. MySQL中的实现

  • 版本链与Undo日志:每次修改数据时,旧版本数据会被保存在Undo日志中,新版本数据则附加到版本链上。

  • ReadView:事务启动时创建的快照视图,用于确定哪些数据版本对当前事务可见。

  • 快照读与当前读:快照读基于ReadView读取历史版本数据,而当前读则读取最新版本数据并加锁。

1 锁机制

MySQL中与MVCC配合的锁机制主要包括以下几种:

1.1 共享锁(S锁)与排他锁(X锁)
  • 共享锁:适用于读操作,允许多个事务同时读取同一数据,但阻止其他事务对该数据加排他锁。

  • 排他锁:用于写操作(如UPDATEDELETE),确保事务独占数据行,其他事务无法对该数据行加任何锁。

READ COMMITTED隔离级别下,读操作不加锁,写操作加排他锁。而在REPEATABLE READ隔离级别下,读操作使用快照读,写操作加排他锁。

1.2 间隙锁(Gap Lock)与临键锁(Next-Key Lock)
  • 间隙锁:锁定索引记录之间的“间隙”,防止其他事务在这些间隙中插入新记录,从而避免幻读。

  • 临键锁:是记录锁和间隙锁的组合,锁定记录本身及其前后的间隙,常用于REPEATABLE READ隔离级别。

1.3 意向锁(Intention Locks)

意向锁用于表级锁定,表明事务对表中某些行的锁定意图。虽然意向锁本身不直接参与MVCC,但它可以帮助优化锁的管理。

2. MVCC与锁机制的配合

  • READ COMMITTED隔离级别下,MVCC通过快照读实现非阻塞读取,而写操作加排他锁。

  • REPEATABLE READ隔离级别下,MVCC结合ReadView和临键锁,确保事务内多次读取结果一致,同时防止幻读。

  • SERIALIZABLE隔离级别下,MVCC几乎不发挥作用,所有读写操作都通过严格的锁机制实现串行化。

3 总结

MySQL的MVCC机制通过版本链、Undo日志和ReadView实现高效的并发读取,而锁机制(如共享锁、排他锁、间隙锁和临键锁)则用于控制写操作和防止幻读。不同的事务隔离级别决定了MVCC与锁机制的具体配合方式。

相关文章:

MVCC(多版本并发控制)机制讲解

MVCC(Multi-Version Concurrency Control,多版本并发控制)这是一个在数据库管理系统中非常重要的技术,尤其是在处理并发事务时。别担心,我会用简单易懂的方式来讲解,让你轻松掌握它的原理和作用。 1. 什么是…...

React 与 Vue 对比指南 - 上

React 与 Vue 对比指南 - 上 本文将展示如何在 React 和 Vue 中实现常见功能&#xff0c;从基础渲染到高级状态管理 Hello 分别使用 react 和 vue 写一个 Hello World&#xff01; react export default () > {return <div>Hello World!</div>; }vue <…...

开源协议深度解析:理解MIT、GPL、Apache等常见许可证

目录 前言1. MIT协议&#xff1a;自由而宽松的开源许可1.1 MIT协议的主要特点1.2 MIT协议的适用场景 2. GPL协议&#xff1a;自由软件的捍卫者2.1 GPL协议的核心理念2.2 GPL协议的适用场景 3. Apache License 2.0&#xff1a;开源与专利保护的平衡3.1 Apache License 2.0的主要…...

通用评估系统(五)- 前端部分总体说明

通用评估系统&#xff08;五&#xff09;- 前端部分总体说明 相关链接 Gitee地址通用评估系统&#xff08;一&#xff09;- 介绍通用评估系统&#xff08;二&#xff09;- 原型设计通用评估系统&#xff08;三&#xff09;- 前端部分通用评估系统&#xff08;四&#xff09;-…...

STM32GPIO

目录 GPIO基本结构GPIO位结构输入部分输出部分 输出模式GPIO模式浮空/上拉/下拉模拟输入开漏和推挽复用开漏/复用推挽 GPIO基本结构 GPIO是挂载在APB2总线上的外设。GPIO结构中的寄存器分为输入寄存器和输出寄存器&#xff0c;APB2总线通过输出寄存器向引脚发送数据&#xff0c…...

MyBatis拦截器终极指南:从原理到企业级实战

在本篇文章中&#xff0c;我们将深入了解如何编写一个 MyBatis 拦截器&#xff0c;并通过一个示例来展示如何在执行数据库操作&#xff08;如插入或更新&#xff09;时&#xff0c;自动填充某些字段&#xff08;例如 createdBy 和 updatedBy&#xff09;信息。本文将详细讲解拦…...

SpringBoot启动失败之application.yml缩进没写好

修改前&#xff1a; spring前面空格了 报错输出&#xff1a;Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the follow…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter17-事件

十七、事件 事件 JavaScript 与 HTML 的交互是通过事件实现的&#xff0c;事件代表文档或浏览器窗口中某个有意义的时刻。可以使用仅在事件发生时执行的监听器&#xff08;也叫处理程序&#xff09;订阅事件。在传统软件工程领域&#xff0c;这个模型叫“观察者模式”&#xff…...

鸿蒙开发:V2版本装饰器之@Monitor装饰器

前言 本文代码案例基于Api13。 随着官方的迭代&#xff0c;在新的Api中&#xff0c;对于新的应用开发&#xff0c;官方已经建议直接使用V2所属的装饰器进行开发了&#xff0c;所以&#xff0c;能上手V2的尽量上手V2吧&#xff0c;毕竟&#xff0c;V2是V1的增强版本&#xff0c;…...

51单片机-外部中断

以外部中断0为例&#xff1a; 主程序中需要有以下代码&#xff1a; EA1; //打开总中断开关 EX01; //开外部中断0 IT00/1&#xff1b; 设置外部中断的触发方式 P3.2\P3.3为外部中断接口&#xff0c;通过控制P3.2口按键按下实现LED灯反转点亮 #include "reg52.h"typed…...

UE C++ UObject 功能的初步总结(结合官方文档)

一. Uboject的官方文档的个人理解 Objects in Unreal Engine | 虚幻引擎 5.5 文档 | Epic Developer Community 目录在此 1.垃圾回收:上篇文章简单介绍过&#xff0c;UObject的创建和回收。本身是很复杂的功能&#xff0c;后续会接着单项深入分析。 2.引用更新 1. 反射:之前…...

DeepSeek和ChatGPT的全面对比

一、模型基础架构对比&#xff08;2023技术版本&#xff09; 维度DeepSeekChatGPT模型家族LLAMA架构改进GPT-4优化版本参数量级开放7B/35B/120B闭源175B位置编码RoPE NTK扩展ALiBiAttention机制FlashAttention-3FlashAttention-2激活函数SwiGLU ProGeGLU训练框架DeepSpeedMeg…...

Spring Boot Actuator 监控✨

Spring Boot Actuator 是 Spring Boot 提供的一个强大的监控和管理工具&#xff0c;它可以帮助你深入了解和监控你的应用程序的运行状态。通过 Actuator&#xff0c;你可以获取应用程序的健康状况、内存使用情况、线程信息、HTTP 请求跟踪等。&#x1f680; 核心知识点 &#…...

构建高效 Python Web 应用:框架与服务器的选择及实践

构建高效 Python Web 应用&#xff1a;框架与服务器的选择及实践 flyfish 从选择合适的 Web 框架&#xff08;如 Flask 和 FastAPI&#xff09;到部署时选用适当的 Web 服务器&#xff08;如 Waitress、Gunicorn、uWSGI 和 Uvicorn&#xff09;的全过程。它不仅介绍了各个框架…...

LED灯闪烁实验:Simulink应用层开发

文章目录 1 阶段目标2 开发过程2.1 模型搭建2.2 模型仿真2.3 数据字典配置2.4 代码生成3 总结1 阶段目标 本文是《LED灯闪烁实验》的第三部分,会通过图文结合的方式,手把手带读者操作Simulink工具进行LED灯闪烁的应用层开发。 本章的开发可分解为如下若干过程: 方波输出建…...

在做题中学习(89):螺旋矩阵

解法&#xff1a;模拟 思路&#xff1a;创建ret数组&#xff0c;用变量标记原矩阵的行数和列数&#xff0c;遍历一个元素就push_back进ret数组&#xff0c;每次遍历完一行或一列&#xff0c;相应行/列数--&#xff0c;进行顺时针螺旋遍历到为0即可。 细节&#xff1a;要有边界…...

使用EasyExcel和多线程实现高效数据导出

​ 使用EasyExcel和多线程实现高效数据导出 1. 概述 在企业级应用中&#xff0c;数据导出是一个常见的需求。为了提高导出效率&#xff0c;尤其是在处理大量数据时&#xff0c;我们可以结合使用EasyExcel库和多线程技术。本文将详细介绍如何通过EasyExcel和多线程技术实现高…...

rabbitmq五种模式的实现——springboot

rabbitmq五种模式的实现——springboot 基础知识和javase的实现形式可以看我之前的博客 代码地址&#xff1a;https://github.com/9lucifer/rabbitmq4j-learning 一、进行集成 &#xff08;一&#xff09;Spring Boot 集成 RabbitMQ 概述 Spring Boot 提供了对 RabbitMQ 的自…...

每日学习Java之一万个为什么

9.Class <?> class1 Myclass.class 为什么要有通配符&#xff1f;传给谁用的&#xff1f; 首先&#xff0c;这里的class特指某个对象在JVM中的元数据集合。 有普通、接口、数组、基本类型、 void 类型、局部类、匿名类、枚举、注解 1.类型安全&#xff1a;通配符允许…...

寒假学习总结

整个寒假都走在数据结构与算法的路上&#xff0c;深入学习了其中多个板块&#xff0c;刷了一些与之对应的题目&#xff0c;下面来一期总结&#xff08;c&#xff09; &#xff08;emmm&#xff0c;主播在寒假试着去学习了几大语言的语法基础&#xff08;丢丢&#xff09; 如Ja…...

别再手动复制了!飞书文档跨账号迁移的3个高效技巧与1个隐藏功能

飞书文档跨账号迁移的高阶操作手册&#xff1a;从基础到深度优化 引言&#xff1a;为什么需要更高效的文档迁移方案&#xff1f; 在团队协作频繁变动的现代办公环境中&#xff0c;文档账号迁移已成为许多飞书用户的刚需场景。无论是个人账号切换、部门重组还是外包交接&#xf…...

深入Livox Avia点云:手把手教你解析CustomMsg中的‘tag’与‘line’字段做噪点过滤

深入Livox Avia点云&#xff1a;手把手教你解析CustomMsg中的‘tag’与‘line’字段做噪点过滤 在三维感知领域&#xff0c;点云数据的质量直接决定了后续算法的精度上限。Livox Avia作为一款高性能固态激光雷达&#xff0c;其独特的CustomMsg格式中隐藏着两个关键字段——tag和…...

NoFences桌面分区管理工具:3分钟打造整洁高效的Windows工作空间

NoFences桌面分区管理工具&#xff1a;3分钟打造整洁高效的Windows工作空间 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为Windows桌面上杂乱无章的图标而烦恼吗&…...

从LSTM到GLU:深入理解门控机制的演变与在Conv1D中的巧妙应用

从LSTM到GLU&#xff1a;深入理解门控机制的演变与在Conv1D中的巧妙应用 门控机制在神经网络中扮演着信息守门人的角色&#xff0c;它决定了哪些信息应该被保留、哪些应该被遗忘。这种机制最早在LSTM中得到广泛应用&#xff0c;但随着计算需求的增长和并行化需求的提升&#xf…...

思源宋体CN:7种字重免费开源中文字体完整指南

思源宋体CN&#xff1a;7种字重免费开源中文字体完整指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文项目寻找专业又免费的中文字体而烦恼吗&#xff1f;Source Han Ser…...

SRWE终极指南:简单运行时窗口编辑器的完整使用教程

SRWE终极指南&#xff1a;简单运行时窗口编辑器的完整使用教程 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾遇到过游戏截图分辨率不够高、应用程序窗口布局不灵活、或者需要为不同平台调整窗口尺寸的…...

【缺陷检测】基于k-means分割Otsu阈值检测水果和蔬菜缺陷(外部和内部缺陷)附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

从HTTP到MQTT:用WebSocket(WS/WSS)打通前后端实时数据,在Vue/React项目里快速集成MQTTX

从HTTP到MQTT&#xff1a;现代前端实时通信的工程实践 引言&#xff1a;实时数据交互的技术演进 在开发物联网仪表盘或实时监控系统时&#xff0c;传统的HTTP轮询方案每秒都在消耗宝贵的服务器资源。我曾参与过一个智能家居项目&#xff0c;最初使用HTTP轮询方案导致服务器在…...

Word2Vec原理与应用:从词向量到NLP实战

1. Word2Vec&#xff1a;当词语成为魔法向量的秘密 2003年&#xff0c;我在处理一个新闻分类项目时首次遭遇了"语义鸿沟"问题——计算机无法理解"苹果"和"Orange"都是水果&#xff0c;而"Apple"同时还代表科技公司。直到2013年Word2Ve…...

Unity UI动效新思路:用TextMeshPro的Sprite Asset制作动态表情和图标文字(含在线工具推荐)

Unity UI动效新思路&#xff1a;用TextMeshPro的Sprite Asset制作动态表情和图标文字 在游戏UI设计中&#xff0c;动态表情和图标文字是提升用户体验的关键细节。传统的实现方式往往需要依赖多个Image组件和Animator控制器&#xff0c;不仅增加场景复杂度&#xff0c;还会影响…...