各位看官,大家早安午安晚安呀~~~

如果您觉得这篇文章对您有帮助的话

欢迎您一键三连,小编尽全力做到更好
欢迎您分享给更多人哦

今天我们来学习:MySQL锁的分类 && MVCC和S/X锁的互补关系

1.锁分类

1.按锁粒度分类:全局锁,表级锁,行级锁

2.按照锁模式分类:.共享锁(Shared Lock,S 锁),排他锁(Exclusive Lock,X 锁)

3.特殊锁类型: 意向锁(表锁,Intention lock), 间隙锁(Gap Lock),临键锁(Next-Key Lock)

2.按锁粒度分类

2.1. 全局锁(Global Lock)

  • 特点:对整个数据库实例加锁,阻塞所有 DML 和 DDL 操作。
  • 命令FLUSH TABLES WITH READ LOCK;
  • 优点
    • 实现简单,确保数据一致性(如全量备份)。

2.2. 表级锁(Table Lock)

  • 特点:对整张表加锁,开销小、加锁快。
  • 命令LOCK TABLES table_name READ/WRITE;
  • 优点
    • 开销小,适合批量操作(如批量插入)

2.3.行级锁

 行级锁(Row Lock)
    • 特点:对索引记录加锁,仅 InnoDB 存储引擎支持。
    • 优点
      • 锁粒度最小,并发性能最高(不同事务可同时操作不同行)。

3.按照锁模式分类

1. 共享锁(Shared Lock,S 锁)
  • 核心规则
    事务对资源加 S 锁后,允许其他事务加 S 锁(共享读),但禁止其他事务加 X 锁(禁止写)
    即:“可以同时读,不能同时写”

  • 适用场景
    仅读取数据,不修改时使用(如SELECT ... LOCK IN SHARE MODE;)。

2.排他锁(Exclusive Lock,X 锁)

  • 核心规则
    事务对资源加 X 锁后,禁止其他事务加任何锁(既不能读,也不能写)
    即:“写的时候,既不能同时读,也不能同时写”

  • 适用场景
    修改数据时使用(如UPDATE/DELETE,数据库会自动加 X 锁;或显式加锁SELECT ... FOR UPDATE;)。

意向锁是表级锁,它的设计是为了协调行级锁和表级锁的关系,避免 “行锁与表锁” 之间的冲突检测效率低下。

4.问题:

4.1. 为什么需要意向锁?

它的核心作用:是通过表级标记 优化 行级锁和表级锁之间的冲突检查,减少锁检查的开销

假设没有意向锁,当事务 A 对表中某行加 S 锁,此时事务 B 想对整个表加 X 锁(如ALTER TABLE),数据库需要:

  1. 检查表中所有行是否有 S 锁 / X 锁(逐行扫描)。
  2. 若表中数据量极大(如 1000 万行),逐行检查会导致性能灾难。

意向锁的作用:提前声明 “事务想对表中的行加 S 锁或 X 锁”,让表级锁的冲突检测只需检查意向锁,无需扫描全行。

2. 意向锁的类型

意向锁是表级锁,分为两种:

  • 意向共享锁(IS 锁):事务声明 “未来可能对表中某些行加 S 锁”。
  • 意向排他锁(IX 锁):事务声明 “未来可能对表中某些行加 X 锁”。
3. 意向锁的工作流程

事务对行加 S 锁 / X 锁前,必须先对表加对应的意向锁:

  1. 事务想对某行加 S 锁 → 先对表加 IS 锁 → 再对行加 S 锁。
  2. 事务想对某行加 X 锁 → 先对表加 IX 锁 → 再对行加 X 锁。

这样的话 =》 如果加表锁的话,一看到有意向锁就 阻塞等待

总之:意向锁既是一种标记(标记事务的意图,它不直接锁定任何行数据,而是在表级别记录事务的操作方向(读还是写)),也是真正的锁(有锁的阻塞和兼容规则)

它的核心作用:是通过表级标记优化行级锁和表级锁之间的冲突检查,减少锁检查的开销

4.2总结:MVCC 与锁的互补关系

为啥有mvcc还需要互斥锁 和 排他锁??

1.肯定是mvcc有局限性呀

MVCC 的优势是提升读写并发性能,但它无法解决所有场景的并发问题,主要局限包括:

  1. 无法处理 “写写冲突”:多个事务同时修改同一行数据时,MVCC 只能通过 “后提交的事务覆盖先提交的” 或 “事务回滚” 处理,无法保证修改的原子性和一致性(必须靠锁解决);
  2. 无法满足 “强一致性读” 需求:如果业务要求 “读取的数据必须是最新的,且在读取期间不被修改”(如金融对账、库存扣减前的校验),MVCC 的 “读历史版本” 机制就不适用了;
  3. 无法处理范围操作的并发问题:如SELECT ... FOR UPDATE(锁定查询范围内的所有行),MVCC 无法保证范围操作的原子性(必须靠锁锁定范围)

2.MVCC 和 S/X 锁并非对立,而是协同工作

  • MVCC 负责优化 “读写并发”:让读操作无需加锁,提升查询性能;
  • S/X 锁负责解决 “写写冲突” 和 “强一致性需求”:保证修改的原子性、数据的一致性,以及特殊场景下的读写安全。

例如:

  • 普通SELECT(无锁):通过 MVCC 读取历史版本,不阻塞写,提升并发;
  • SELECT ... FOR SHARE(加 S 锁)(强一致性需求):通过 S 锁保证读取最新数据,且期间不被修改;
  • UPDATE/DELETE:通过 X 锁(写写冲突)保证同一时间只有一个事务能修改,避免脏写。

因此,即使有 MVCC,共享锁和排他锁仍是必不可少的 —— 它们解决了 MVCC 无法覆盖的并发场景,共同保证数据库的 ACID 特性。

5.间隙锁和临键锁:
可以看我的另一篇博客讲解

上述就是MySQL锁的分类 && MVCC和S/X锁的互补关系,不知道您对文章中的问题和思想是否都学会理解了呢?

能看到这里相信您一定对小编的文章有了一定的认可。

有什么问题欢迎各位大佬指出
欢迎各位大佬评论区留言修正~~

您的支持就是我最大的动力​​​!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93915.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93915.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93915.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第五届智能通信与计算国际学术会议(ICICC 2025)

重要信息 官网:www.ic-icc.org 时间:2025年8月15-16日 地点:中国 南京 第五届智能通信与计算国际学术会议(ICICC 2025)定于2025年8月15-16日在中国 南京举行。随着信息技术的飞速发展,智能通信与计算领域的研究与…

基于C#和NModbus4库实现的Modbus RTU串口通信

基于C#和NModbus4库实现的Modbus RTU串口通信&#xff0c;包含完整的界面设计和功能实现&#xff1a;一、项目依赖配置NuGet包安装&#xff1a; Install-Package NModbus4 Install-Package System.IO.Ports窗体控件布局&#xff1a; <!-- 基础控件配置 --> <ComboBox …

想要批量提取视频背景音乐?FFmpeg 和转换器都安排上

你是否遇到过这样的情况&#xff1f;看到一个超赞的短视频&#xff0c;里面的背景音乐特别好听&#xff0c;想单独保存下来当手机铃声或收藏&#xff0c;却不知道怎么把音乐从视频里“抠”出来&#xff1f;别担心&#xff01;今天就为大家分享两种简单易行的方法&#xff0c;无…

为什么MCP协议是AI集成的未来API

一、企业AI应用的核心挑战与架构演进 当前企业AI落地面临三大核心痛点&#xff1a; ​​系统集成困境​​&#xff1a;需对接企业内部业务系统&#xff08;CRM/ERP等&#xff09;​​异构环境兼容​​&#xff1a;需整合第三方AI服务与传统API​​数据孤岛突破​​&#xff1…

Apache Tomcat样例目录session操纵漏洞解读

【漏洞名称】&#xff1a;Apache Tomcat样例目录session操纵漏洞 &#xff08;Apache Tomcat示例目录漏洞&#xff09;【漏洞等级】&#xff1a;中危&#xff0c;5.9分。【漏洞描述】Apache Tomcat默认安装页面中存在examples样例目录&#xff0c;里面存放着Servlets、JSP、Web…

Go语言实战案例:实现HTTP客户端请求并解析响应

本文是 Go 网络与并发实战系列的第2篇&#xff0c;聚焦于如何使用 Go 实现一个 HTTP 客户端&#xff0c;完成请求发送、响应解析、错误处理、Header与Body提取等完整流程。一、前言&#xff1a;为什么学习HTTP客户端&#xff1f;在日常开发中&#xff0c;无论是调用 RESTful AP…

java的冒泡排序算法

冒泡排序是一种简单的排序算法&#xff0c;通过重复遍历待排序序列&#xff0c;比较相邻元素并在必要时交换位置&#xff0c;最终实现排序。以下是Java实现的详细说明&#xff1a;核心原理‌比较相邻元素‌&#xff1a;从序列第一个元素开始&#xff0c;逐对比较相邻元素的大小…

玻尔兹曼分布与玻尔兹曼探索

目录 玻尔兹曼分布定义 玻尔兹曼探索&#xff1a; 1. 玻尔兹曼分布公式 2. 温度 T 如何影响采样结果&#xff1f; (1) 高温 (T→∞)&#xff1a; (2) 低温 (T→0)&#xff1a; (3) 中等温度 (T∈(0,∞))&#xff1a; 3. 直观示例 4. 实际应用中的意义 5.核心误区澄清…

【工具】jsDelivr CDN完全指南:免费高速的开源项目CDN服务

前言 在现代Web开发中&#xff0c;内容分发网络&#xff08;CDN&#xff09;已经成为提升网站性能的重要工具。jsDelivr作为一个免费、快速、可靠的开源CDN服务&#xff0c;为全球开发者提供了优质的静态资源分发服务。无论是加速GitHub仓库访问、分发npm包&#xff0c;还是为…

OSPF笔记整理

一、OSPF 基础特性1. 技术背景&#xff08;对比 RIP&#xff09;RIP 的缺陷&#xff1a;最大跳数 15 限制、周期性发送全路由表&#xff08;占用带宽&#xff09;、收敛慢、以跳数为度量值、易产生环路、30 秒更新间隔。OSPF 的改进&#xff1a;无跳数限制&#xff08;支持大规…

sqLite 数据库 (3):以编程方式使用 sqLite,4 个函数,以及 sqLite 移植,合并编译

&#xff08;22&#xff09; 只有四个函数 &#xff1a;以及 &#xff1a;&#xff08;23&#xff09;以及 &#xff1a;&#xff08;24&#xff09;&#xff08;25&#xff09; sqLite 的源代码很少 &#xff1a;&#xff08;26&#xff09;&#xff08;27&#xff09;&#x…

Nginx跨域问题与 MIME 类型错误深度排错指南:解决 MIME type of “application/octet-stream“ 报错

前言&#xff1a;在 Web 开发中&#xff0c;跨域请求和资源加载错误是前端工程师和运维人员经常遇到的棘手问题。本文将详细解析 Nginx 环境下跨域配置的多种方案、gzip 类型参数的优化要点&#xff0c;以及.mjs 文件 MIME 类型错误的解决方法&#xff0c;并结合排错思路和原理…

什么是大端?什么是小端?如何验证?

什么是大端&#xff1f;什么是小端&#xff1f;如何验证&#xff1f; 在计算机系统中&#xff0c;大端&#xff08;Big-Endian&#xff09; 和小端&#xff08;Little-Endian&#xff09; 是两种不同的字节序&#xff08;Byte Order&#xff09;&#xff0c;用于描述多字节数据…

JavaScript 语句和函数

1. JavaScript 语句 1&#xff09;if语句 if (condition) statement1 else statement2这里的条件&#xff08;condition&#xff09;可以是任何表达式&#xff0c;并且求值结果不一定是布尔值。 ECMAScript会自动调用Boolean()函数将这个表达式的值转换为布尔值。 如果条件…

代码随想录刷题Day22

替换数字 这道题比较简单&#xff0c;遇到字母就copy到新的字符数组&#xff0c;如果是遇到数字&#xff0c;就在新字符数组中加入number的字符串。代码如下&#xff1a; #include<stdio.h> #include<ctype.h> #include<string.h> #define Max 1000000 int…

逻辑回归参数调优实战指南

逻辑回归的参数调节参数展示 LogisticRegression(penaltyl2,dualFalse,tol1e4,C1.0,fit_interceptTrue,intercept_scaling1,class_weightNone,random_stateNone,solverliblinear,max_iter100,multi_classovr,verbose0,warm_startFalse, n_jobs1)在前面的学习中&#xff0c;我们…

cocosCreator2.4 googlePlay登录升级、API 35、16KB内存页面的支持

环境&#xff1a;我这里是cocosCreator 2.4.12 导出的android 工程 登录升级 后台收到的google 的提醒&#xff1a; 之前是通过implementation com.google.android.gms:play-services-auth:20.0.0 来获取玩家 uid 和 邮箱&#xff0c;然后发送到我们的服务器获取账号。 升级…

unity avpro实现互动影游关键问题

创建视频播放器​在Hierarchy面板中右键创建&#xff1a;Video > AVPro Video - MediaPlayer创建后会生成一个MediaPlayer对象&#xff0c;用于控制视频播放添加视频资源将视频文件放入项目的StreamingAssets文件夹下在MediaPlayer组件的设置中选择要播放的视频文件在UI上显…

【C找第一个只出现一次的字符】2022-8-18

缘由样例通过&#xff0c;请问为什么错了呢&#xff1f;(语言-c语言)-编程语言-CSDN问答 char str[100000];fgets(str, 100000, stdin);int a[26]{}, i, count 0;int len strlen(str);for (i 0; i<len; i) a[str[i] - a];for (i 0; i<len; i){if (a[str[i] - a] 1){…

MCP AI应用通信的底层机制

技术小馆专注AI与Java领域的前沿技术知识库 技术小馆官网 在AI应用快速发展的今天&#xff0c;不同AI系统之间的高效通信成为技术架构的关键挑战。MCP&#xff08;Model Context Protocol&#xff09;作为新一代AI应用通信协议&#xff0c;正在重新定义AI工具生态的构建方式。…