当前位置: 首页 > 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 配置来启用同…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

基于Uniapp的HarmonyOS 5.0体育应用开发攻略

一、技术架构设计 1.混合开发框架选型 &#xff08;1&#xff09;使用Uniapp 3.8版本支持ArkTS编译 &#xff08;2&#xff09;通过uni-harmony插件调用原生能力 &#xff08;3&#xff09;分层架构设计&#xff1a; graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...