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

mysql mvcc 锁 关系

多版本并发控制(MVCC)是一种用于数据库并发控制的机制,它可以在保证数据一致性的同时,提高数据库的并发性能。下面结合 MVCC 机制,详细阐述常见的四种事务隔离级别(读未提交、读已提交、可重复读、串行化)与各种锁(共享锁、排他锁、记录锁、间隙锁、临键锁)之间的关系。

读未提交(Read Uncommitted)

  • MVCC 机制:在该隔离级别下,MVCC 机制基本不发挥作用。因为此隔离级别允许一个事务读取另一个未提交事务的数据,它更侧重于提高并发性能,而不是通过 MVCC 来保证数据的一致性。事务在读取数据时,不会基于 MVCC 去判断数据版本,而是直接读取最新的数据,无论该数据是否已经提交。
  • 共享锁(S 锁)和排他锁(X 锁)
    • 此隔离级别对锁的使用进行了极大程度的弱化。一般情况下,普通的读操作不会加共享锁,写操作(如 UPDATEDELETEINSERT)虽可能会对受影响的行加排他锁,但这种锁的限制作用相对较弱,因为即使有排他锁存在,其他事务也能读取未提交的数据,会导致脏读。
  • 记录锁、间隙锁和临键锁
    • 通常不会使用记录锁、间隙锁和临键锁。由于不依赖 MVCC 来保证数据一致性,也不需要这些锁来防止不可重复读和幻读问题。

读已提交(Read Committed)

  • MVCC 机制:MVCC 在该隔离级别中发挥重要作用。普通的 SELECT 查询采用快照读,基于 MVCC 读取已提交的数据版本。每个语句执行时,都会生成一个新的快照,这使得在同一个事务内不同时刻执行相同的查询可能会得到不同的结果,从而可能出现不可重复读的问题。
  • 共享锁(S 锁)和排他锁(X 锁)
    • 共享锁:普通的 SELECT 查询默认不会加共享锁,而是利用 MVCC 进行快照读。但当使用 SELECT ... LOCK IN SHARE MODE 时,会对查询结果集的行加共享锁,允许其他事务同时读取这些行,但阻止其他事务对这些行加排他锁进行修改。
    • 排他锁UPDATEDELETEINSERT 语句以及 SELECT ... FOR UPDATE 会对受影响的行加排他锁。并且,这些锁是语句级别的,即锁只在语句执行期间有效,语句执行完毕后锁就会释放。
  • 记录锁、间隙锁和临键锁
    • 记录锁:在执行 SELECT ... FOR UPDATE 或写操作时,会对读取或修改的行加记录锁。
    • 间隙锁和临键锁:一般不会使用间隙锁和临键锁。因为 MVCC 的快照读机制和语句级别的锁控制,使得该隔离级别允许幻读的存在,无法阻止其他事务在查询范围的间隙插入新记录。

可重复读(Repeatable Read)

  • MVCC 机制:MVCC 是该隔离级别实现可重复读特性的关键。在事务开始时,会创建一个全局的快照,事务内的所有 SELECT 查询都基于这个快照进行,保证在同一个事务内多次读取相同数据的结果是一致的。不过,对于当前读操作(如 SELECT ... FOR UPDATEUPDATEDELETE),MVCC 机制与锁机制共同作用来保证数据的一致性。
  • 共享锁(S 锁)和排他锁(X 锁)
    • 共享锁:普通 SELECT 查询采用快照读,不会加共享锁。使用 SELECT ... LOCK IN SHARE MODE 时,会对查询结果集的行加共享锁,防止其他事务对这些行加排他锁进行修改。
    • 排他锁UPDATEDELETEINSERT 语句以及 SELECT ... FOR UPDATE 会对受影响的行加排他锁。这些锁会在事务结束(提交或回滚)时才释放。
  • 记录锁、间隙锁和临键锁
    • 记录锁:在执行 SELECT ... FOR UPDATE 或写操作时,会对读取或修改的行加记录锁。
    • 间隙锁:当进行范围查询(如 SELECT ... FOR UPDATE 或写操作涉及范围条件)且查询条件没有精确匹配到所有记录时,会对查询范围对应的间隙加上间隙锁,防止其他事务在这些间隙插入新记录。这是为了弥补 MVCC 在处理范围插入时可能出现幻读的不足。
    • 临键锁:临键锁是记录锁和间隙锁的组合。在可重复读隔离级别下,对于索引记录,InnoDB 通常使用临键锁来防止幻读。例如,对唯一索引进行等值查询时,如果记录存在,使用记录锁;如果记录不存在,使用间隙锁;对于普通索引,一般使用临键锁。

串行化(Serializable)

  • MVCC 机制:在串行化隔离级别下,MVCC 机制基本不发挥作用。因为该隔离级别要求事务串行执行,所有的读写操作都需要排队进行,以保证数据的绝对一致性。它不依赖 MVCC 的多版本特性来处理并发,而是通过严格的锁机制来实现事务的隔离。
  • 共享锁(S 锁)和排他锁(X 锁)
    • 共享锁:普通的 SELECT 查询会自动对查询结果集的行加共享锁,保证在当前事务读取数据期间,其他事务不能对这些数据加排他锁进行修改。
    • 排他锁UPDATEDELETEINSERT 语句会自动对受影响的行加排他锁。由于事务是串行执行的,任何事务的读写操作都需要等待前面事务释放相应的锁,并发性能最差,但能完全避免脏读、不可重复读和幻读问题。
  • 记录锁、间隙锁和临键锁
    • 在串行化隔离级别下,记录锁、间隙锁和临键锁都会被使用,以确保事务之间的完全隔离。无论是读取还是修改数据,都会通过这些锁来保证同一时间只有一个事务可以访问特定的数据资源,从而实现事务的串行执行。

综上所述,MVCC 机制和锁机制在不同的事务隔离级别中相互配合,共同影响着数据库的并发性能和数据一致性。较低的隔离级别更依赖 MVCC 来提高并发性能,而较高的隔离级别则更强调锁机制来保证数据的严格一致性。

相关文章:

mysql mvcc 锁 关系

多版本并发控制(MVCC)是一种用于数据库并发控制的机制,它可以在保证数据一致性的同时,提高数据库的并发性能。下面结合 MVCC 机制,详细阐述常见的四种事务隔离级别(读未提交、读已提交、可重复读、串行化&a…...

安卓手机基于 Termux 安装 AList 并设置开机自启的详细教程

安装 AList 安装 Termux: 点击下载 更新软件包:打开 Termux,运行以下命令以更新软件包列表并升级已安装的软件包: bash复制 pkg update && pkg upgrade安装 AList:运行以下命令安装 AList: bash复…...

LeetCode:503.下一个更大元素II

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:503.下一个更大元素II 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[…...

实验5 配置OSPFv2验证

实验5 配置OSPFv2验证 1.实验目的 (1)OSPFv2 验证的类型和意义。 (2)配置基于区域的 OSPFv2 简单口令验证和 MD5 验证的方法。 (3)配置基于链路的 OSPFv2 简单口令验证和 MD5 验证的方法。 2.实验准备 配置…...

第二节 docker基础之---镜像构建及挂载

查看当前镜像: [rootdocker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE [rootdocker ~]#很明显docker是咱们新搭建的所以目前还没有镜像 1,搜索镜像: [rootdocker ~]# docker search centos 搜索镜像并过滤是官…...

论文阅读:MGMAE : Motion Guided Masking for Video Masked Autoencoding

MGMAE:Motion Guided Masking for Video Masked Autoencoding Abstract 掩蔽自编码(Masked Autoencoding)在自监督视频表示学习中展现了出色的表现。时间冗余导致了VideoMAE中高掩蔽比率和定制的掩蔽策略。本文旨在通过引入运动引导掩蔽策略&#xff0…...

记录一下 在Mac下用pyinstallter 打包 Django项目

安装: pip install pyinstaller 在urls.py from SheepMasterOneToOne import settings from django.conf.urls.static import staticurlpatterns [path("admin/", admin.site.urls),path(generate_report/export/, ReportAdmin(models.Report, admin.site).generat…...

【漫话机器学习系列】084.偏差和方差的权衡(Bias-Variance Tradeoff)

偏差和方差的权衡(Bias-Variance Tradeoff) 1. 引言 在机器学习模型的训练过程中,我们常常面临一个重要的挑战:如何平衡 偏差(Bias) 和 方差(Variance),以提升模型的泛…...

deepseek本地部署-linux

1、官网推荐安装方法(使用脚本,我绕不过github,未采用) 登录ollama下载网站https://ollama.com/download/linux,linux下有下载脚本。 正常来说,在OS系统下直接执行脚本即可。 2、手动安装方法 2.1获取ol…...

解决使用python提取word文档中所有的图片时图片丢失的问题

python解析word文档,提取文档中所有的图片并保存,并将原图位置用占位符替换。 问题描述 利用python-dox库解析word文档,并提取里面的所有图片时发现会出现一摸一样的图片只解析一次,导致图片丢失,数量不对的情况。 …...

【Spring相关知识】Spring应用如何优雅使用消息队列

文章目录 概述**核心概念****使用场景****快速入门**1. 添加依赖2. 配置 Binder3. 定义消息通道4. 发送和接收消息5. 运行应用 **高级特性****优点****适用场景** 概述 Spring Cloud Stream 是一个用于构建消息驱动微服务的框架,它基于 Spring Boot 和 Spring Inte…...

人工智能:从概念到未来

人工智能:从概念到未来 一、引言 在当今数字化时代,人工智能(Artificial Intelligence,AI)已从科幻小说和电影中的幻想逐渐走进现实,成为推动社会进步和经济发展的关键力量。它正在深刻地改变着我们的生活…...

CUDA Graph

cudaGraphLaunch 是 NVIDIA CUDA API 中的一个函数,用于在 CUDA Graphs 中启动一个已实例化的图。 CUDA Graphs 简介 CUDA Graphs 是 NVIDIA CUDA 编程模型中的一种技术,旨在优化 GPU 程序的性能。它允许将一系列连续的 GPU 操作(如计算和数…...

1343. 大小为 K 且平均值大于等于阈值的子数组数目

目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 在遍历时维护一个统计的变量,用来统计满足条件的子数组个数 2.2 代码尝试 class Solution { public:int numOfSubarrays(vec…...

IDEA+DeepSeek让Java开发起飞

1.获取DeepSeek秘钥 登录DeepSeek官网 : https://www.deepseek.com/ 进入API开放平台,第一次需要注册一个账号 进去之后需要创建一个API KEY,然后把APIkey记录保存下来 接着我们获取DeepSeek的API对话接口地址,点击左边的:接口…...

C# winforms 使用菜单和右键菜单

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决

目录 概述|背景 报错解析 解决方法 IDEA配置解决 Pom配置插件解决 概述|背景 报错发生背景:在SpringBoot项目中引入Lombok依赖并使用后出现"找不到符号"的问题。 本文讨论在上述背景下发生的报错原因和解决办法,如果仅为了解决BUG不论原…...

C基础寒假练习(6)

一、终端输入行数&#xff0c;打印倒金字塔 #include <stdio.h> int main() {int rows;printf("请输入倒金字塔的行数: ");scanf("%d", &rows);for (int i rows; i > 0; i--) {// 打印空格for (int j 0; j < rows - i; j) {printf(&qu…...

【论文翻译】DeepSeek-V3论文翻译——DeepSeek-V3 Technical Report——第一部分:引言与模型架构

论文原文链接&#xff1a;DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明&#xff0c;本文不做任何商业用途&#xff0c;仅作为个人学习相关论文的翻译记录。本文对原文内容直译&#xff0c;一切以论文原文内容为准&#xff0c;对原文作者表示…...

【docker】Failed to allocate manager object, freezing:兼容兼容 cgroup v1 和 v2

参考大神让系统同时兼容 cgroup v1 和 v2 要解决你系统中只挂载了 cgroup v2 但需要兼容 cgroup v1 的问题,可以通过以下几步来使系统同时兼容 cgroup v1 和 cgroup v2。这样 Docker 和其他服务就可以正常工作了。步骤 1:更新 Grub 配置,启用兼容模式 编辑 GRUB 配置来启用同…...

VSCode远程开发必备:SSH端口转发一键配置指南(含常见问题排查)

VSCode远程开发实战&#xff1a;SSH端口转发高效配置与深度排错 当你在咖啡厅修改代码时&#xff0c;远程服务器上的数据库服务突然需要紧急调试&#xff1b;当团队协作时&#xff0c;同事的内网API接口需要临时开放给你测试——这些场景下&#xff0c;SSH端口转发就像一把瑞士…...

NaViL-9B图文问答教程:支持中英双语提问的跨语言理解能力实测

NaViL-9B图文问答教程&#xff1a;支持中英双语提问的跨语言理解能力实测 1. 认识NaViL-9B NaViL-9B是一款原生多模态大语言模型&#xff0c;由专业研究机构开发。它最吸引人的特点是能够同时理解文字和图片内容&#xff0c;并且支持中文和英文两种语言的提问。想象一下&…...

提升Blender渲染效率:立方盒反射烘培与材质优化指南

提升Blender渲染效率&#xff1a;立方盒反射烘培与材质优化指南 在3D创作领域&#xff0c;渲染效率与质量始终是设计师面临的核心挑战。Blender作为开源三维软件的代表&#xff0c;其渲染引擎的灵活性与强大功能为艺术家提供了无限可能&#xff0c;但同时也对硬件资源提出了较高…...

专业级视频对比分析工具:video-compare的技术架构深度解析

专业级视频对比分析工具&#xff1a;video-compare的技术架构深度解析 【免费下载链接】video-compare Split screen video comparison tool using FFmpeg and SDL2 项目地址: https://gitcode.com/gh_mirrors/vi/video-compare 在视频编码质量评估、算法效果验证和媒体…...

YOLOv11自定义数据集训练避坑指南:从data.yaml配置到模型选择(实测对比v8)

YOLOv11自定义数据集训练实战&#xff1a;从数据配置到模型调优的深度解析 在计算机视觉领域&#xff0c;目标检测技术的迭代速度令人目不暇接。作为YOLO系列的最新成员&#xff0c;YOLOv11凭借其优化的网络结构和训练策略&#xff0c;正在成为工业界和学术界的热门选择。然而&…...

英雄联盟智能工具集:3个颠覆性功能重塑你的游戏体验

英雄联盟智能工具集&#xff1a;3个颠覆性功能重塑你的游戏体验 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 作为英雄联盟玩家…...

UE5项目GPU瓶颈卡顿?手把手教你用GPU Visualizer揪出渲染性能元凶

UE5项目GPU瓶颈卡顿&#xff1f;手把手教你用GPU Visualizer揪出渲染性能元凶 当你的UE5项目在真机测试时突然掉帧到30fps以下&#xff0c;而编辑器里明明运行流畅——这种"开发环境正常&#xff0c;实机表现崩盘"的困境&#xff0c;相信每个UE开发者都经历过。上周我…...

STM32与W25Q64:构建自定义上位机字库烧录系统的实践指南

1. 为什么需要自定义字库烧录系统 在嵌入式显示项目中&#xff0c;中文字库的处理一直是个头疼的问题。我去年接手一个工业HMI项目&#xff0c;客户要求设备能显示繁简体中文、日文和部分特殊符号。最初尝试用SD卡加载字库&#xff0c;结果现场有30%的设备因为SD卡接触不良导致…...

TensorRT性能调优实战指南:从瓶颈诊断到引擎优化

TensorRT性能调优实战指南&#xff1a;从瓶颈诊断到引擎优化 【免费下载链接】TensorRT NVIDIA TensorRT™ 是一个用于在 NVIDIA GPU 上进行高性能深度学习推理的软件开发工具包&#xff08;SDK&#xff09;。此代码库包含了 TensorRT 的开源组件 项目地址: https://gitcode.…...

ChatTTS 量化模型实战:从模型压缩到推理效率提升

最近在部署 ChatTTS 模型时&#xff0c;遇到了一个很实际的问题&#xff1a;模型虽然效果不错&#xff0c;但体积大、推理慢&#xff0c;在资源受限的边缘设备上跑起来非常吃力。显存动不动就占好几个G&#xff0c;生成一段语音的等待时间也让人着急。为了解决这个问题&#xf…...