mysql mvcc 锁 关系
多版本并发控制(MVCC)是一种用于数据库并发控制的机制,它可以在保证数据一致性的同时,提高数据库的并发性能。下面结合 MVCC 机制,详细阐述常见的四种事务隔离级别(读未提交、读已提交、可重复读、串行化)与各种锁(共享锁、排他锁、记录锁、间隙锁、临键锁)之间的关系。
读未提交(Read Uncommitted)
- MVCC 机制:在该隔离级别下,MVCC 机制基本不发挥作用。因为此隔离级别允许一个事务读取另一个未提交事务的数据,它更侧重于提高并发性能,而不是通过 MVCC 来保证数据的一致性。事务在读取数据时,不会基于 MVCC 去判断数据版本,而是直接读取最新的数据,无论该数据是否已经提交。
- 共享锁(S 锁)和排他锁(X 锁)
- 此隔离级别对锁的使用进行了极大程度的弱化。一般情况下,普通的读操作不会加共享锁,写操作(如
UPDATE
、DELETE
、INSERT
)虽可能会对受影响的行加排他锁,但这种锁的限制作用相对较弱,因为即使有排他锁存在,其他事务也能读取未提交的数据,会导致脏读。
- 此隔离级别对锁的使用进行了极大程度的弱化。一般情况下,普通的读操作不会加共享锁,写操作(如
- 记录锁、间隙锁和临键锁
- 通常不会使用记录锁、间隙锁和临键锁。由于不依赖 MVCC 来保证数据一致性,也不需要这些锁来防止不可重复读和幻读问题。
读已提交(Read Committed)
- MVCC 机制:MVCC 在该隔离级别中发挥重要作用。普通的
SELECT
查询采用快照读,基于 MVCC 读取已提交的数据版本。每个语句执行时,都会生成一个新的快照,这使得在同一个事务内不同时刻执行相同的查询可能会得到不同的结果,从而可能出现不可重复读的问题。 - 共享锁(S 锁)和排他锁(X 锁)
- 共享锁:普通的
SELECT
查询默认不会加共享锁,而是利用 MVCC 进行快照读。但当使用SELECT ... LOCK IN SHARE MODE
时,会对查询结果集的行加共享锁,允许其他事务同时读取这些行,但阻止其他事务对这些行加排他锁进行修改。 - 排他锁:
UPDATE
、DELETE
、INSERT
语句以及SELECT ... FOR UPDATE
会对受影响的行加排他锁。并且,这些锁是语句级别的,即锁只在语句执行期间有效,语句执行完毕后锁就会释放。
- 共享锁:普通的
- 记录锁、间隙锁和临键锁
- 记录锁:在执行
SELECT ... FOR UPDATE
或写操作时,会对读取或修改的行加记录锁。 - 间隙锁和临键锁:一般不会使用间隙锁和临键锁。因为 MVCC 的快照读机制和语句级别的锁控制,使得该隔离级别允许幻读的存在,无法阻止其他事务在查询范围的间隙插入新记录。
- 记录锁:在执行
可重复读(Repeatable Read)
- MVCC 机制:MVCC 是该隔离级别实现可重复读特性的关键。在事务开始时,会创建一个全局的快照,事务内的所有
SELECT
查询都基于这个快照进行,保证在同一个事务内多次读取相同数据的结果是一致的。不过,对于当前读操作(如SELECT ... FOR UPDATE
、UPDATE
、DELETE
),MVCC 机制与锁机制共同作用来保证数据的一致性。 - 共享锁(S 锁)和排他锁(X 锁)
- 共享锁:普通
SELECT
查询采用快照读,不会加共享锁。使用SELECT ... LOCK IN SHARE MODE
时,会对查询结果集的行加共享锁,防止其他事务对这些行加排他锁进行修改。 - 排他锁:
UPDATE
、DELETE
、INSERT
语句以及SELECT ... FOR UPDATE
会对受影响的行加排他锁。这些锁会在事务结束(提交或回滚)时才释放。
- 共享锁:普通
- 记录锁、间隙锁和临键锁
- 记录锁:在执行
SELECT ... FOR UPDATE
或写操作时,会对读取或修改的行加记录锁。 - 间隙锁:当进行范围查询(如
SELECT ... FOR UPDATE
或写操作涉及范围条件)且查询条件没有精确匹配到所有记录时,会对查询范围对应的间隙加上间隙锁,防止其他事务在这些间隙插入新记录。这是为了弥补 MVCC 在处理范围插入时可能出现幻读的不足。 - 临键锁:临键锁是记录锁和间隙锁的组合。在可重复读隔离级别下,对于索引记录,InnoDB 通常使用临键锁来防止幻读。例如,对唯一索引进行等值查询时,如果记录存在,使用记录锁;如果记录不存在,使用间隙锁;对于普通索引,一般使用临键锁。
- 记录锁:在执行
串行化(Serializable)
- MVCC 机制:在串行化隔离级别下,MVCC 机制基本不发挥作用。因为该隔离级别要求事务串行执行,所有的读写操作都需要排队进行,以保证数据的绝对一致性。它不依赖 MVCC 的多版本特性来处理并发,而是通过严格的锁机制来实现事务的隔离。
- 共享锁(S 锁)和排他锁(X 锁)
- 共享锁:普通的
SELECT
查询会自动对查询结果集的行加共享锁,保证在当前事务读取数据期间,其他事务不能对这些数据加排他锁进行修改。 - 排他锁:
UPDATE
、DELETE
、INSERT
语句会自动对受影响的行加排他锁。由于事务是串行执行的,任何事务的读写操作都需要等待前面事务释放相应的锁,并发性能最差,但能完全避免脏读、不可重复读和幻读问题。
- 共享锁:普通的
- 记录锁、间隙锁和临键锁
- 在串行化隔离级别下,记录锁、间隙锁和临键锁都会被使用,以确保事务之间的完全隔离。无论是读取还是修改数据,都会通过这些锁来保证同一时间只有一个事务可以访问特定的数据资源,从而实现事务的串行执行。
综上所述,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中高掩蔽比率和定制的掩蔽策略。本文旨在通过引入运动引导掩蔽策略࿰…...

记录一下 在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)
一、终端输入行数,打印倒金字塔 #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——第一部分:引言与模型架构
论文原文链接:DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明,本文不做任何商业用途,仅作为个人学习相关论文的翻译记录。本文对原文内容直译,一切以论文原文内容为准,对原文作者表示…...
【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 配置来启用同…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...