mysql中的的锁

news/2025/3/4 20:44:02/

mysql的事务

MySQL 锁分类详解

MySQL锁可以根据 锁的类型、加锁的范围(颗粒度)、锁的思想三大类。


一、按锁的类型分类

1. 共享锁(S Lock)

  • 作用:允许事务读取数据,其他事务可加共享锁,但不可加排他锁。
  • 场景SELECT ... FOR SHARELOCK TABLES ... READ

2. 排他锁(X Lock)

  • 作用:允许事务修改数据,其他事务不可加任何锁。
  • 场景SELECT ... FOR UPDATELOCK TABLES ... WRITE、写操作(INSERT/UPDATE/DELETE)。

二、按锁的粒度(范围)分类

1. 全局锁

  • 作用:锁定整个数据库实例,禁止所有写入操作(只读模式)。
  • 命令FLUSH TABLES WITH READ LOCK(需手动释放)。
  • 用途:全库逻辑备份时确保数据一致性。

2. 表级锁

  • 共享表锁(S Lock)
    • 添加方式LOCK TABLES table_name READ
    • 兼容性:允许其他事务加共享锁,禁止排他锁。
  • 排他表锁(X Lock)
    • 添加方式LOCK TABLES table_name WRITE
    • 兼容性:禁止其他事务加任何锁。
  • 意向锁(IS/IX)
    • 意向共享锁(IS):事务准备在行级加共享锁时,自动在表级添加 IS。
    • 意向排他锁(IX):事务准备在行级加排他锁时,自动在表级添加 IX。
    • 作用:快速判断表内是否有行级锁,避免全表扫描。
    • 兼容性:IS 与 IX 兼容,但 IS/IX 与表级 S/X 锁互斥。

3. 行级锁(InnoDB 特有)

  • 记录锁(Record Lock)

    • 作用:锁定具体某一行(共享或排他)。
    • 触发方式
      • 显式:SELECT ... FOR SHARE(S 锁)或 FOR UPDATE(X 锁)。
      • 隐式:所有写操作(INSERT/UPDATE/DELETE)自动对受影响行加 X 锁。
  • 间隙锁(Gap Lock)

    • 作用:锁定索引记录之间的间隙(如 id BETWEEN 5 AND 10),防止其他事务插入新数据,解决幻读。

    • 触发条件:仅在 REPEATABLE READ 隔离级别下生效。

    • 查询条件与索引唯一性
      是否加间隙锁不仅取决于查询范围,还受 索引唯一性查询结果确定性 影响:

      查询类型命中索引类型是否加间隙锁备注
      精确查询唯一索引不加间隙锁唯一索引数据一定记录唯一,不会涉及到记录之间的间隙
      非精确查询非唯一索引加间隙锁范围查询 非唯一索引 InnoDB 认为可能存在幻读的风险 一定加间隙锁
      精确查询非唯一索引取决于查询的数据是否唯一如果数据唯一,不加间隙锁;如果数据不唯一,可能加间隙锁
      非精确查询唯一索引取决于查询的数据是否唯一就算是唯一索引但是查询的范围包含多个可能的插入位置,InnoDB 认为可能存在幻读的风险(如where statistics_date > ‘2022-08-01’ 可能影响多行数据。),除非查询范围内的数据仍然是唯一的 (如根据主键in删除)

      核心规则
      InnoDB 仅在 无法确定查询结果唯一性 时加间隙锁。唯一索引的精确命中查询可直接锁定记录,无需间隙锁。

  • Next-Key Lock

    • 组成:记录锁 + 间隙锁,锁定行及其前面的间隙。
    • 场景:范围查询(如 SELECT * FROM t WHERE id > 100)。
  • 插入意向锁(Insert Intention Lock)

    • 作用:标记事务准备插入的位置,是一种特殊的间隙锁。
    • 兼容性:多个插入意向锁在相同间隙可共存,但与间隙锁冲突。
    • 触发方式INSERT 操作前自动添加。

三、按锁的思想分类

1. 悲观锁

  • 核心:假设并发冲突必然发生,主动加锁控制。
  • 实现SELECT ... FOR UPDATE、写操作自动加锁。

2. 乐观锁

  • 核心:假设无冲突,提交时检测版本是否变化(如 CAS)。
  • 实现:通过版本号字段或时间戳判断数据是否被修改。
  • 场景:高并发读多写少场景(如库存扣减)。

四、关键细节与常见误区

1. 间隙锁的概念

间隙锁​ 是一种范围锁,用于锁定 ​数据记录之间的间隙​(例如两个已有记录之间的区间),而不是锁定事务操作的时间间隔。它的主要作用是防止其他事务在这些数据间隙中插入新记录,从而避免幻读问题。

2. 间隙锁的触发条件

  • 仅在 REPEATABLE READ 级别生效,READ COMMITTED 下不生效。

3. 插入意向锁的特殊性

  • 与间隙锁的关系:插入意向锁会等待间隙锁释放,但允许其他插入意向锁共存。
  • 示例:事务 A 对间隙 (5,10) 加间隙锁,事务 B 试图在该间隙插入时,会先加插入意向锁并等待。

4. Next-Key Lock 的幻读解决

  • REPEATABLE READ 下,通过锁定索引记录及间隙,确保范围内数据不被插入新值。

5. 表级锁与存储引擎的关系

  • LOCK TABLES 是 MySQL Server 层实现的表锁,与存储引擎无关。
  • InnoDB 通常使用行级锁,避免显式表锁(LOCK TABLES 会破坏行锁的并发优势)。

五、锁的兼容性分析

5.1 表级锁与意向锁的兼容性矩阵

当前锁 \ 请求锁S(表)X(表)ISIX
S(表)✔️
X(表)
IS✔️✔️
IX✔️✔️
  • 说明
    • 表级 共享锁(S Lock)排他锁(X Lock) 与意向锁(IS/IX)互斥。
    • 意向锁之间(IS 与 IX)是兼容的。

5.2 插入意向锁的兼容性分析

锁类型是否兼容是否等待详细说明
插入意向锁兼容不需要等待多个事务可在同一间隙加插入意向锁(允许并发插入同一间隙)。
共享锁(S Lock)兼容不需要等待共享锁是行级记录锁,作用于具体行;插入意向锁作用于间隙,二者无直接冲突。
排他锁(X Lock)不兼容需要等待排他锁是行级记录锁,若插入意向锁的间隙包含被 X 锁锁定的行,则需等待。
间隙锁(Gap Lock)不兼容需要等待间隙锁直接锁定区间,插入意向锁需等待间隙锁释放才能插入。
  • 说明
    • 插入意向锁是一种特殊的间隙锁,主要用于标记插入意图。
    • 与共享锁兼容,但与排他锁和间隙锁冲突,需等待锁释放。
    • 允许多个事务在同一间隙加插入意向锁,但实际插入时需通过行锁(记录锁)竞争确保唯一性。

http://www.ppmy.cn/news/1576642.html

相关文章

springBoot连接远程Redis连接失败(已解决)

问题: 首先,我是先用jedis进行的redis连接,成功连接,没有任何问题,说明redis配置,以及访问地址、端口、密码都是正确的。 我的yml文件配置如下: spring:redis:host: 远程ip地址port: 6379password: 密码…

Windows环境下Maven的配置

Windows环境下Maven的配置 一、Maven下载 Maven官网地址 apache-maven-3.8.8-bin.zip 二、安装和配置 解压到本地目录,例如:D:\software\apache-maven-3.8.8 新建变量MAVEN_HOMED:\software\apache-maven-3.8.8(以自己的安装路径为准&…

C/C++结构体的内存对齐详解(深入探究结构体在内存里的保存形式)

深入探究:结构体在内存里的保存形式 引言 在C和C等编程语言中,结构体(struct)是一种用户自定义的数据类型,它允许我们将不同类型的数据组合在一起,形成一个逻辑上的整体。理解结构体在内存中的保存形式对…

AI大模型之一 GodeGPT调用Dify+DeepSeek属于自己私域模型

前言 Dify是一款综合能力很强的大模型数据训练客户端 功能丰富 能更好的训练属于自己领域的只能问答AI Dify是一个开源的大语言模型(LLM)应用开发平台,旨在简化和加速生成式AI应用的创建和部署。它结合了后端即服务(Backend as S…

【Go语言快速上手】第一部分:数据类型(数组、切片、映射)与控制语句

文章目录 一、复合类型Ⅰ 数组1. 语法2. 示例3. 特点4. 数组的传递 Ⅱ 切片1. 定义2. 语法3. 示例4. 特点5. 切片的创建6. 切片的操作切片的扩展切片的拷贝 Ⅲ 映射1. 定义2. 语法3. 示例4. 特点5. 映射的创建6. 映射的操作示例:插入、访问和删除判断键是否存在示例…

server.servlet.session.timeout: 12h(HTTP 会话的超时时间为 12 小时)

从你提供的配置文件(应该是 Spring Boot 的 application.yml 或 application.properties 文件)来看,以下部分与会话超时时间相关: server:servlet:session:timeout: 12h # timeout: 30cookie:name: VENDER_SID会话超时时间的…

Apache nifi demo 实验

Apache nifi 是个数据流系统,可以通过配置 自定义的流程来实现数据的转换。 比如可以配置一个流程,读取数据库里的数据,再转换,最后保存到本地文件。 这样可以来实现一些数据转换的操作,而不用特地编写程序来导入导出。…

自然语言处理:稀疏向量表示

介绍 大家好,我是博主。今天又来和大家分享自然语言处理领域的知识了。原本我计划这次分享NLP中文本表示的相关内容,不过在整理分享计划的过程中,发现这部分知识里包含一些涉及复杂数学原理和抽象概念的内容。对于刚接触NLP的小伙伴们来说&a…