详解MySQL的MVCC机制与间隙锁
在MySQL的InnoDB存储引擎中,MVCC(多版本并发控制)和间隙锁(Gap Lock)是两种关键的并发控制机制。MVCC主要用于提高读写并发性能,而间隙锁则用于实现更严格的事务隔离,防止幻读现象。以下是对MySQL MVCC机制和间隙锁的详细解释。
MVCC(多版本并发控制)
基本原理
MVCC通过为每行数据维护多个版本来实现并发控制。在InnoDB中,每行数据会有两个隐藏的列:
trx_id:记录最后一次修改该行的事务ID。roll_pointer:指向该行的上一个版本,用于构建回滚链(undo log)。
此外,还有两个额外的列:
DB_ROW_ID:行ID,唯一标识一行数据。DB_TRX_ID:事务ID,标识最近一次修改该行数据的事务。
工作方式
MVCC主要依赖于快照读(Snapshot Read)和当前读(Current Read)来实现。
-
快照读(Snapshot Read):
- 快照读是读取数据的一个快照,通常是通过一致性非锁定读来实现的。事务开始时,InnoDB会创建一个一致性视图(Consistent Read View),记录当前系统中活跃事务的ID。
- 每次读取数据时,InnoDB会根据一致性视图判断数据行的版本是否对当前事务可见。如果数据行的
trx_id小于事务的视图,则该行版本对当前事务可见;否则,InnoDB会沿着roll_pointer指向的回滚链找到对当前事务可见的版本。
-
当前读(Current Read):
- 当前读是读取数据的最新版本,并且会对读取的数据加锁,防止其他事务修改。当前读通常用于需要锁定读取数据的操作,如
SELECT ... FOR UPDATE、SELECT ... LOCK IN SHARE MODE、UPDATE、DELETE等。
- 当前读是读取数据的最新版本,并且会对读取的数据加锁,防止其他事务修改。当前读通常用于需要锁定读取数据的操作,如
间隙锁(Gap Lock)
定义
间隙锁是一种锁定机制,用于锁定索引记录之间的间隙,而不是具体的记录。间隙锁的主要目的是防止幻读现象,即在一个事务的执行过程中,另一个事务插入新的记录,从而导致前后读取结果不一致。
工作方式
间隙锁通常在以下情况下使用:
-
范围查询:
- 当执行范围查询(如
SELECT ... WHERE column BETWEEN A AND B FOR UPDATE)时,InnoDB会锁定查询范围内的所有记录以及这些记录之间的间隙。
- 当执行范围查询(如
-
唯一索引:
- 当执行唯一索引的插入或更新操作时,如果插入的键值已经存在,InnoDB会锁定该键值以及其前后的间隙,防止其他事务插入相同的键值。
例子
假设有一张表t,包含字段id,且表中已有记录(1, 2, 4, 5):
- 间隙锁示例:
- 事务A执行
SELECT * FROM t WHERE id BETWEEN 2 AND 4 FOR UPDATE,InnoDB会锁定记录2和4之间的间隙,即锁定范围(2, 4)。 - 在事务A提交之前,事务B不能在该间隙内插入新记录,如插入
id=3的记录。
- 事务A执行
MVCC与间隙锁的结合
在可重复读(REPEATABLE READ)隔离级别下,InnoDB结合使用MVCC和间隙锁来实现高效的并发控制和严格的事务隔离:
-
避免幻读:
- 通过间隙锁,InnoDB可以防止其他事务在当前事务的读取范围内插入新记录,从而避免幻读现象。
-
提高并发性能:
- 通过MVCC,InnoDB允许多个事务并发读取相同的数据快照,而无需加锁,从而提高了系统的并发性能。
总结
MySQL的MVCC机制通过维护数据的多个版本,实现了高效的并发控制和事务隔离。而间隙锁则通过锁定索引记录之间的间隙,防止幻读现象,确保事务的隔离性。两者相结合,使得MySQL在保证数据一致性的同时,能够提供较高的并发性能。这对于需要高并发和严格事务隔离的应用场景尤为重要。
相关文章:
详解MySQL的MVCC机制与间隙锁
在MySQL的InnoDB存储引擎中,MVCC(多版本并发控制)和间隙锁(Gap Lock)是两种关键的并发控制机制。MVCC主要用于提高读写并发性能,而间隙锁则用于实现更严格的事务隔离,防止幻读现象。以下是对MyS…...
新版校园跑腿外卖独立版+APP+小程序前端外卖配送平台源码
源码介绍: 同城校园跑腿外卖配送平台源码,支持自定义diy 你可以设计你的页面,设计你自己的风格,支持多校园,独立版本,多商户,有用户端,骑手端,商家端,强大的…...
# ROS 获取激光雷达数据 (Python实现)
ROS 获取激光雷达数据 (Python实现) 实现思路 构建一个新的软件包,包名叫做lidar_pkg在软件包中新建一个节点,节点名叫做lidar_node.py在节点中,向ROS大管家rospy申请订阅话题/scan,并设置回调函数为Lidarcallback()构建回调函数…...
单点登录(SSO)前端怎么做
单点登录(SSO)前端怎么做 本文介绍单点登录(SSO)是什么,还有就是前端怎么做。 单点登录(SSO)是什么 单点登录(SSO,Single Sign On),是在企业内部…...
【面试干货】索引的作用
【面试干货】索引的作用 1、索引的作用 💖The Begin💖点点关注,收藏不迷路💖 1、索引的作用 索引 可以协助 快速查询、更新数据库表中数据。 通过使用索引,数据库系统能够快速定位到符合查询条件的数据,提…...
【成品设计】基于红外线的目标跟踪无线测温系统设计
《基于红外线的目标跟踪无线测温系统设计》 整体功能: A端:无线跟踪端 主控:采用STM32F103C8T6单片机作为核心控制。360度编码模块数字脉冲输出红外解码编码模块OLED屏幕。 B端:无线待测端 主控:采用STM32F103C8T…...
抽象,自定义函数,递归
6.1懒惰是一种美德 如果你 在一个地方编写了一些代码,但需要在另一个地方再次使用,该如何办呢? 假设你编写了一段代码,它计算一些斐波那契数(一种数列,其中每个数都是前两个数的和)。 现在的…...
php设计模式之策略模式详解
策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。在PHP中应用策略模式可以让你轻松地根据需要选择和交换算法或策略,而无需修改使用这些算法的代码。 策略模式的核心概念: 目的&…...
Android在不同层面增加应用
1 App 应用代码一般在开发者的项目目录下,packages/apps/YourApp/,比如app/src/main/java目录下 对于系统应用,源代码可能位于packages/apps/目录下,例如packages/apps/Settings。 用户安装的应用(从Google Play或其…...
【Pycharm】功能介绍
1.Code Reformat Code 格式化代码,可以帮助我们去自动调整空格等,根据python语法规范自动调整 2.Settings 1.创建py文件默认填充模版 3.读写py文件编码格式一致性 顶部代码指定的编码方式作用: 可以保证python2/3解释器在读取文件的时候按…...
安卓手机平板使用JuiceSSH无公网IP远程连接本地服务器详细流程
文章目录 前言1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 前言 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? 本文就和大家分享一下如何使用 cpolarJuiceSSH 实现手机端远程连接Linux…...
告别冗长代码:Java Lambda 表达式如何简化你的编程
在现代软件开发中,高效和简洁的代码变得越来越重要。Java作为一门成熟而广泛使用的编程语言,一直在不断进化,以满足开发者的需求。Java 8的推出标志着一次重要的飞跃,其中最引人注目的特性之一便是Lambda表达式。 Lambda表达式为J…...
不同生成式AI模型的优缺点(GAN,VAE,FLOW)
不同生成式人工智能模型的优缺点 近年来,生成式 AI 模型因其能够创建新的原创内容而备受关注。这些模型旨在生成类似于给定训练数据集的数据,从而产生逼真且富有创意的输出。了解不同类型的生成式 AI 模型及其优缺点对于研究人员、开发人员和用户做出明…...
VMware ESXi 8.0U2c macOS Unlocker OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版
VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版 VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U2 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链…...
SpringCloud Consul基础入门与使用实践总结
【1】Consul简介 官网地址:https://www.consul.io/intro/index.html 下载地址:https://www.consul.io/downloads.html 中文文档:https://www.springcloud.cc/spring-cloud-consul.html ① 基础概念 Consul 是一套开源的分布式服务发现和…...
pdf拆分成有图和无图的pdf(方便打印)
pdf拆分成有图和无图的pdf(方便打印) 原因 打印图片要彩印,每次都要手动弄,打印的时候很麻烦; 随着打印次数的增加,时间就越来越多 为解决此问题,使用python写一个exe解决这个问题 历程 找一个python的GUI界面找到 t…...
通用树查找算法
想要一个树形控件来显示数据,却发现Racket的GUI库竟然没有提供这个控件。既然没有,那就自己手搓一个吧。没想到,在做这个控件中竟然有了新发现! 树形控件有一个功能是查找树中指定的节点。这就是接下来的故事的起点。 1 找外援 不…...
Flutter 中的 TableCell 小部件:全面指南
Flutter 中的 TableCell 小部件:全面指南 Flutter 是一个功能强大的 UI 框架,由 Google 开发,允许开发者使用 Dart 语言构建跨平台的移动、Web 和桌面应用。在 Flutter 的丰富组件库中,TableCell 是一个用于创建表格单元格的组件…...
clickhouse学习笔记(一)入门与安装
目录 一 、入门 简介 核心特性包括 1.1 列式存储 1.2 原生压缩 1.3 向量化执行引擎 1.4 DBMS 功能 1.5 分布式处理 1.6 高吞吐写入能力 1.7 实时分析 1.8 SQL支持 1.9 高度可扩展 1.10 数据分区与线程级并行 1.11 应用场景 1.12 不适用场景 二、ClickHouse单机版…...
【JavaEE精炼宝库】多线程(4)深度理解死锁、内存可见性、volatile关键字、wait、notify
目录 一、死锁 1.1 出现死锁的常见场景: 1.2 产生死锁的后果: 1.3 如何避免死锁: 二、内存可见性 2.1 由内存可见性产生的经典案例: 2.2 volatile 关键字: 2.2.1 volatile 用法: 2.2.2 volatile 不…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
