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

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

1. MVCC(多版本并发控制)机制

MVCC 的核心就是 Undo Log+ Read View,“MV”就是通过 Undo Log 来保存数据的历史版本,实现多版本的管理,“CC”是通过 Read View 来实现管理,通过 Read View 原则来决定数据是否显示。同时针对不同的隔离级别,Read View 的生成策略不同,也就实现了不同的隔离级别。

1.1. MVCC的概念

MVCC的概念:

MVCC(Multiversion Concurrency Control,多版本并发控制)是一种基于乐观锁思想实现事务隔离的技术,核心是:

  • 保存数据的多个版本(历史快照)
  • 读取时通过版本号判断是否可见,无需加锁

MVCC解决的问题:

  1. 读写之间阻塞的问题,通过 MVCC 可以让读写互相不阻塞,即读不阻塞写,写不阻塞读,这样就可以提升事务并发处理能力。
  2. 降低了死锁的概率。这是因为 MVCC 采用了乐观锁的方式,读取数据时并不需要加锁,对于写操作,也只锁定必要的行。
  3. 解决一致性读的问题。一致性读也被称为快照读,当我们查询数据库在某个时间点的快照时,只能看到这个时间点之前事务提交更新的结果,而不能看到这个时间点之后事务提交的更新结果。

快照读vs当前读:

类型

描述

是否加锁

快照读

读取的是历史版本(不加锁)

当前读

读取的是最新版本数据(加锁)

快照读示例:

SELECT * FROM player WHERE ...  -- 快照读(不加锁)

当前读示例:

SELECT * FROM player LOCK IN SHARE MODE;  -- 加锁读
UPDATE player SET ...                     -- DML 操作

1.2. MVCC 的实现原理(InnoDB中)

当查询一条记录的时候,系统如何通过多版本并发控制技术找到它:

  1. 首先获取事务自己的版本号,也就是事务 ID;
  2. 获取 Read View;
  3. 查询得到的数据,然后与 Read View 中的事务版本号进行比较;
  4. 如果不符合 Read View 规则,就需要从 Undo Log 中获取历史快照;
  5. 最后返回符合规则的数据。

InnoDB中存储记录的多个版本的方法:

1. 事务版本号(Transaction ID)

  • 每个事务启动时,InnoDB 分配唯一的递增事务 ID。
  • 用于判断操作先后顺序。

2. 行记录的隐藏列

InnoDB 的叶子段存储了数据页,数据页中保存了行记录,而在行记录中有一些重要的隐藏字段。

InnoDB 为每条记录维护隐藏字段:

字段名

含义

db_row_id

隐藏行 ID,用于创建聚集索引

db_trx_id

最后修改该行记录的事务 ID

db_roll_ptr

回滚指针,指向 Undo Log 的位置

3. Undo Log(撤销日志)

  • 用于保存行记录的历史版本。
  • 以链表形式连接历史版本,支持回滚和快照读取。

Read View 的作用与原理

1. Read View 定义:

  • 一个事务启动时生成的视图,记录当前活跃事务的 ID 列表。
  • 用于判断某行记录是否对当前事务可见。

2. Read View主要字段:

字段

含义

trx_ids

当前活跃事务 ID 集合(未提交事务)

low_limit_id

trx_ids 中最大事务 ID

up_limit_id

trx_ids 中最小事务 ID

creator_trx_id

当前事务 ID(即创建此 Read View 的事务)

3. Read View的可见性判断规则:

  • T < up_limit_id → 可见(提交早)
  • T > low_limit_id → 不可见(提交晚)
  • up_limit_id < T < low_limit_id
  • T ∈ trx_ids → 不可见(事务未提交)
  • T ∉ trx_ids → 可见(事务已提交)

4. 事务隔离级别下 Read View 行为

隔离级别

Read View 获取频率

是否避免不可重复读

读已提交

每次 SELECT 创建新 Read View

可重复读

第一次 SELECT 后复用 Read View

        1. 在隔离级别为读已提交(Read Commit)时,一个事务中的每一次 SELECT 查询都会获取一次 Read View。

如果 Read View 不同,就可能产生不可重复读或者幻读的情况。

        2. 当隔离级别为可重复读的时候,就避免了不可重复读,这是因为一个事务只在第一次 SELECT 的时候会获取一次 Read View,而后面所有的 SELECT 都会复用这个 Read View。

1.3. InnoDB解决幻读的方法

在可重复读的情况下,InnoDB 可以通过 Next-Key 锁 +MVCC 来解决幻读问题。

出现幻读的原因是在读已提交的情况下,InnoDB 只采用记录锁(Record Locking)。

InnoDB 三种行锁的方式:

  • 记录锁:针对单个行记录添加锁。
  • 间隙锁(Gap Locking):可以帮我们锁住一个范围(索引之间的空隙),但不包括记录本身。采用间隙锁的方式可以防止幻读情况的产生。
  • Next-Key 锁:帮我们锁住一个范围,同时锁定记录本身,相当于间隙锁 + 记录锁,可以解决幻读的问题。

在隔离级别为可重复读时,InnoDB 会采用 Next-Key 锁的机制,帮我们解决幻读问题。

相关文章:

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

1. MVCC&#xff08;多版本并发控制&#xff09;机制 MVCC 的核心就是 Undo Log Read View&#xff0c;“MV”就是通过 Undo Log 来保存数据的历史版本&#xff0c;实现多版本的管理&#xff0c;“CC”是通过 Read View 来实现管理&#xff0c;通过 Read View 原则来决定数据是…...

Mac M1 安装 ffmpeg

1.前言 官网那货没有准备m系列的静态包&#xff0c;然后我呢&#xff0c;不知道怎么想的就从maven项目中的 javacv-platform&#xff0c;且版本为1.5.11依赖里面将这个静态包把了出来&#xff0c;亲测能用&#xff0c;感觉比那些网上说的用什么wget编译安装、brew安装快多了。…...

Spring框架学习day3--Spring数据访问层管理(IOC)

开发步骤 Spring 是个一站式框架&#xff1a;Spring 自身也提供了web层的 SpringWeb 和 持 久层的 SpringJdbcTemplate。 开发步骤 1.导入jar包 pom.xml <!-- spring-jdbc--> <dependency><groupId>org.springframework</groupId><artifactId>…...

什么是集群(Cluster)?如何保证集群的高可用性?

一、什么是Elasticsearch集群(Cluster)? 集群是指由一个或多个节点(Node)组成的集合,这些节点共同存储数据、处理请求,并协调工作以提供统一的搜索服务。一个集群有唯一的集群名称(默认名为elasticsearch),节点通过名称加入对应的集群。集群的核心目标是: 扩展存储…...

React从基础入门到高级实战:React 核心技术 - 动画与过渡效果:提升 UI 交互体验

React 动画与过渡效果&#xff1a;提升 UI 交互体验 在现代 Web 开发中&#xff0c;动画和过渡效果不仅仅是视觉上的点缀&#xff0c;它们在提升用户体验、引导用户注意力以及增强交互性方面扮演着重要角色。作为一款广受欢迎的前端框架&#xff0c;React 提供了多种实现动画的…...

重读《人件》Peopleware -(13)Ⅱ 办公环境 Ⅵ 电话

当你开始收集有关工作时间质量的数据时&#xff0c;你的注意力自然会集中在主要的干扰源之一——打进来的电话。一天内接15个电话并不罕见。虽然这看似平常&#xff0c;但由于重新沉浸所需的时间&#xff0c;它可能会耗尽你几乎一整天的时间。当一天结束时&#xff0c;你会纳闷…...

Free2AI:企业智能化转型的加速器

随着数字化与智能化的深度交融&#xff0c;企业的竞争舞台已悄然转变为数据处理能力和智能服务水平的竞技场。Free2AI以其三大核心功能——智能数据采集、多格式文档解析、智能FAQ构建&#xff0c;为企业铺设了一条从数据洞察到智能服务的全链路升级之路&#xff0c;成为推动企…...

Python训练营打卡Day40

DAY 40 训练和测试的规范写法 知识点回顾&#xff1a; 1.彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中 2.展平操作&#xff1a;除第一个维度batchsize外全部展平 3.dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作…...

制作一款打飞机游戏63:自动保存

1.编辑器的自动保存实现 ‌目标‌&#xff1a;将自动保存功能扩展到所有编辑器&#xff0c;包括脑编辑器、模式编辑器、敌人编辑器和动画/精灵编辑器。‌实现方式‌&#xff1a; ‌代码复制‌&#xff1a;将关卡编辑器中的自动保存代码复制到其他编辑器中。‌标记数据变更‌&a…...

使用animation.css库快速实现CSS3旋转动画效果

CSS3旋转动画效果实现&#xff08;使用Animate.css&#xff09; 下面我将展示如何使用Animate.css库快速实现各种CSS3旋转动画效果&#xff0c;同时提供一个直观的演示界面。 思路分析 引入Animate.css库创建不同旋转动画的展示区域添加控制面板自定义动画效果实现实时预览功…...

基于NetWork的类FNAF游戏DEMO框架

脑洞大开 想做个fnaf1并加入自己的设计.. 开干!!!! #include <stdio.h> #include <iostream> #include <random> #include <ctime>bool leftdoor true, rightdoor true, camddoor true; float power 900,fanusepower 0;typedef struct movement…...

湖北理元理律师事务所:债务优化中的生活保障实践

在债务压力与生活质量失衡的普遍困境中&#xff0c;法律服务的价值不仅在于解决债务问题&#xff0c;更在于帮助债务人重建生活秩序。湖北理元理律师事务所通过其债务优化服务&#xff0c;探索出一条“法律生活”的双轨路径。 债务规划的核心矛盾&#xff1a;还款能力与生存需…...

golang连接sm3认证加密(app)

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 文档用途 golang连接安全版sm3认证加密数据库,驱动程序详见附件。 详细信息 1.下载Linux golang安装包 go1.17.3.linux-amd64.tar.gz 1.1. 解压安…...

【Zephyr 系列 2】用 Zephyr 玩转 Arduino UNO / MEGA,实现串口通信与 CLI 命令交互

🎯 本篇目标 在 Ubuntu 下将 Zephyr 运行在 Arduino UNO / MEGA 上 打通串口通信,实现通过串口发送命令与反馈 使用 Zephyr Shell 模块,实现 CLI 命令处理 🪧 为什么 Arduino + Zephyr? 虽然 Arduino 开发板通常用于简单的 C/C++ 开发,但 Zephyr 的支持范围远超 STM32…...

AIS常见问题解答(AIS知识补充)

AIS常见问题解答 什么是 AIS&#xff1f; AIS 是“自动识别系统”的缩写。AIS 是一种基于甚高频 (VHF) 的导航和防撞工具&#xff0c;可以实现船舶之间的信息交换。这些信息&#xff08;AIS 数据&#xff09;还会被丹麦海事局运营的岸基 AIS 系统收集。因此&#xff0c;在提及 …...

基于Matlab实现指纹识别系统

【指纹识别系统基础概念】 指纹识别技术是一种生物特征识别技术&#xff0c;它利用人的指纹独一无二的特性进行个人身份的验证。指纹的细节特征&#xff0c;如脊、谷、分岔等&#xff0c;构成了指纹的唯一性&#xff0c;使得指纹识别在安全性、可靠性和便捷性上具有显著优势。…...

Windows10下搭建sftp服务器(附:详细搭建过程、CMD连接测试、连接失败问题分析解决等)

最终连接sftp效果 搭建sftp服务器 1、这里附上作者已找好的 freeSSHd安装包 ,使用它进行搭建sftp服务器。 2、打开freeSSHd安装包,进行安装 (1)、选择完全安装 (2)、安装完成后,对提示窗口选择关闭 (3)、安装完成后,提示是否安装私有密钥。我们选择"是" (4)、安…...

Vue3中Element-Plus中el-input及el-select 边框样式

如果不需要显示下边框&#xff0c;纯无边框直接将 【border-bottom: 1px solid #C0C4CC; 】注掉或去掉即可。 正常引用组件使用即可&#xff0c;无须自定义样式&#xff0c;最终效果CSS样式。 <style scoped> /* 输入框的样式 */ :deep(.el-input__wrapper) { box-sha…...

vue + ant-design + xlsx 实现Excel自定义模板导入功能

Vue Ant Design 扩展&#xff1a;实现Excel自定义模板导入功能 引言 在企业级应用场景中&#xff0c;除了数据导出&#xff0c;模板化导入是另一个核心需求。本文将深入讲解如何基于Vue3 Ant Design Vue xlsx技术栈&#xff0c;实现以下高级导入功能&#xff1a; 自定义模…...

SAP saml2 元数据 HTTP 错误

使⽤事务 SAML2 或 SAML2_IDP 在 ABAP 系统中配置 SAML 2.0 时&#xff0c; Web 页⾯返回 403 已禁⽌、 404 未找到 或 500 服务器内部错误。 在事务 SAML2 中下载元数据时&#xff0c; ⽹页返回 403 已禁⽌、 404 未找到或 500 服务器内部错误。 在事务 SAML2_IDP 中下载…...

知识课堂|sCMOS相机可编程快门模式解析

sCMOS相机凭借高灵敏度、高动态、低读出噪声特性&#xff0c;成为生命科学成像领域的核心设备。在光片荧光显微镜LSFM成像应用中&#xff0c;传统卷帘快门的时序限制可能引发运动伪影或光片照明不均匀问题。可编程快门模式通过精确控制传感器曝光时序&#xff0c;实现与激光扫描…...

数据结构之栈:原理与常用方法

1. 栈的定义 Stack是Vector的一个子类&#xff0c;它实现标准的后进先出堆栈。Stack只定义了创建空堆栈的默认构造方法。&#xff08;实际上是实现了List接口&#xff0c;因为Vector是List的子类&#xff09;。 Stack() // 创建一个空栈 2. 栈的基本操作 // 压栈操作 publi…...

在React框架中使用Braft Editor集成Table表格的详细教程

简介&#xff1a;Braft Editor是一款基于draft-js开发的React富文本编辑器&#xff0c;支持多媒体、自定义样式和扩展功能。其表格扩展模块允许用户插入、调整表格结构&#xff0c;适合需要数据展示的场景&#xff08;如CMS系统、报表工具&#xff09;。 1.安装依赖 yarn add…...

跳动的爱心

跳动的心形图案&#xff0c;通过字符打印和延时效果模拟跳动&#xff0c;心形在两种大小间交替跳动。 通过数学公式生成心形曲线 #include <stdio.h> #include <windows.h> // Windows 系统头文件&#xff08;用于延时和清屏&#xff09; void printHeart(int …...

gbase8s数据库+mybatis问题记录

在实际使用中一般都是mybatis数据库连接池组合使用&#xff0c;单独使用mybatis 连接数据库时&#xff0c;在循环使用PreparedStatement 时 会发生内存泄漏&#xff0c;PreparedStatement资源得不到释放 测试代码片段如下 drawMapper sqlsession.getMapper(DrawMapper.class…...

实现安卓端与苹果端互通的方案多种多样,以下是一些主要的方案

一、使用跨平台开发框架 1.React Native&#xff1a;通过React Native&#xff0c;开发者可以利用React.js的强大生态系统来构建原生移动应用。该框架允许使用相同的代码库在Android和iOS上开发应用&#xff0c;从而节省时间和成本。它支持热重载功能&#xff0c;使得开发者在…...

SpringBoot开发——Spring Boot异常处理全攻略:五大方案实战对比

文章目录 一、血泪教训:异常处理的代价二、五大异常处理方案详解2.1 全局异常处理(推荐方案)2.2 控制器级处理2.3 HTTP状态码注解2.4 ResponseEntity精细控制2.5 自定义异常体系(企业级方案)三、五大方案对比决策表四、四大避坑指南4.1 异常吞噬陷阱4.2 循环依赖问题4.3 异…...

React-props

文章目录 前言✅ 一、什么是 props&#xff1f;✅ 二、props 的特点✅ 三、props 的核心细节 & 常见问题1. **props 是新对象还是引用&#xff1f;**2. **函数作为 props&#xff1a;闭包陷阱**3. **默认值 & 解构默认值**4. **props.children 是什么&#xff1f;**5. …...

【C++篇】list模拟实现

实现接口&#xff1a; list的无参构造、n个val构造、拷贝构造 operator重载 实现迭代器 push_back() push_front() erase() insert() 头尾删 #pragma once #include<iostream> #include<assert.h> using namespace std;namespace liu {//定义list节点temp…...

Oracle exist

Oracle中的EXISTS是用于检查子查询结果是否为空的逻辑运算符&#xff0c;其核心特点和用法如下&#xff1a; ‌基础语法‌ SELECT columns FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE condition); 当子查询返回至少一行时返回TRUE&#xff0c;否则返回FALSE。 ‌执…...