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

MySQL InnoDB 的锁机制

引言

        锁是数据库管理并发访问的另一种核心机制,与 MVCC 相辅相成。本文将系统梳理 MySQL InnoDB 中锁的粒度、类型和工作原理,并深入探讨它如何与事务隔离级别配合,共同保障数据的一致性和完整性。

一、 锁的粒度:由粗到细

        InnoDB 支持多种粒度的锁,允许系统在锁开销和数据安全性之间进行权衡:

  1. 全局锁:锁定整个数据库实例,主要用于全库逻辑备份,影响巨大。

  2. 表级锁:锁定整张表,主要包括:

    • 元数据锁 (MDL):由 Server 层实现,保证读写的表结构一致性。

    • 意向锁 (Intention Locks):一种表级锁,用于快速判断表内是否有行锁。它表明“一个事务想要在表中的某些行上获取共享锁或排他锁”。

      • 意向共享锁 (IS):事务打算给某些行加S锁

      • 意向排他锁 (IX):事务打算给某些行加X锁

    • AUTO-INC 锁:一种特殊的表级锁,用于在插入时生成自增列的值。在 MySQL 8.0 中,轻量级模式已大幅减少其影响。

  3. 行级锁:InnoDB 并发能力的核心,锁定索引记录。

二、 行级锁的三种算法

        行锁是 InnoDB 的精髓,它包含三种算法,用于在不同场景下防止幻读和数据冲突:

  1. 记录锁 (Record Lock):锁定索引中的一条具体记录

  2. 间隙锁 (Gap Lock):锁定索引记录之间的间隙(开区间),防止其他事务在这个间隙中插入新记录,从而有效防止幻读

  3. 临键锁 (Next-Key Lock)记录锁 + 间隙锁的组合,锁定一个记录及其前面的间隙(左开右闭区间)。它是 InnoDB 在 可重复读 (RR) 隔离级别下默认的行锁算法。

三、 锁的兼容性与死锁

  • 共享锁 (S) 与排他锁 (X):基本的行锁类型。

    • S锁(读锁):允许其他事务读,但不能写。SELECT ... LOCK IN SHARE MODE 会加 S锁。

    • X锁(写锁):不允许其他事务读(当前读)或写。UPDATE, DELETE, INSERT, SELECT ... FOR UPDATE 会加 X锁。

    • S锁与S锁兼容,S锁与X锁、X锁与X锁互斥。

  • 死锁:不同的事务以不同的顺序请求和持有锁,导致互相等待。InnoDB 有死锁检测机制,会自动选择回滚其中一个代价较小的事务。

四、 锁与隔离级别的实战

        锁的使用策略与隔离级别密不可分:

  • READ COMMITTED (RC)

    • 快照读:使用 MVCC,无锁。

    • 当前读FOR UPDATE等)及写操作:仅使用记录锁。因为不加间隙锁,所以无法避免幻读。

  • REPEATABLE READ (RR)

    • 快照读:使用 MVCC,无锁。

    • 当前读写操作:使用临键锁(Next-Key Lock),通过在搜索范围内加锁,彻底杜绝幻读。(特例:唯一索引的唯一查询会退化为记录锁)。

  • SERIALIZABLE (可串行化)

    • 所有读操作(即使是普通 SELECT)都会自动转换为 SELECT ... LOCK IN SHARE MODE,即加共享锁。读写严重互斥,并发性能最低。

五、 特殊锁:插入意向锁 (Insert Intention Locks)

        这是一种特殊的间隙锁,不是表级意向锁。它在执行 INSERT 操作前设置,表示想往某个间隙里插入一条记录。它的存在是为了提高并发插入的性能:

  • 多个事务可以在同一个间隙上同时持有插入意向锁(只要插入的位置不同)。

  • 但它会与独占的间隙锁/临键锁冲突。这正是防止幻读的关键:一个事务持有间隙锁,另一个事务的插入意向锁就会被阻塞。

 更多资料:0voice · GitHub


文章转载自:

http://x1HO0VqG.zrLms.cn
http://q4uoOaDD.zrLms.cn
http://msAMj8nm.zrLms.cn
http://w8ZH4BSW.zrLms.cn
http://kheZPJvs.zrLms.cn
http://DuMweDbk.zrLms.cn
http://AFtw65Bm.zrLms.cn
http://TBZjfj9g.zrLms.cn
http://z41v97bH.zrLms.cn
http://ISLhvtfb.zrLms.cn
http://gt6LiuGW.zrLms.cn
http://Y8ddDmUF.zrLms.cn
http://ulResTbX.zrLms.cn
http://4Po77W44.zrLms.cn
http://GhKX4ysF.zrLms.cn
http://7u0BuOUX.zrLms.cn
http://uyXVaEAG.zrLms.cn
http://o7MVdDZ1.zrLms.cn
http://xadzc1Y2.zrLms.cn
http://GeMkF6Xq.zrLms.cn
http://BKEpNaHx.zrLms.cn
http://epaPo6J1.zrLms.cn
http://YyJnYmyp.zrLms.cn
http://cYJsCGBF.zrLms.cn
http://yWUvDZV1.zrLms.cn
http://pPeUlwNR.zrLms.cn
http://VN87UVHC.zrLms.cn
http://oOvuqtNC.zrLms.cn
http://Eo3qYkDT.zrLms.cn
http://39ivl5gm.zrLms.cn
http://www.dtcms.com/a/368589.html

相关文章:

  • 海盗王64位dx9客户端修改篇之五
  • 官宣:Apache Cloudberry (Incubating) 2.0.0 发布!
  • SpringBoot 中 ThreadLocal 的妙用:原理、实战与避坑指南
  • Unity Hub 创建支持 Android iOS 的项目教程
  • LangGraph节点完整组成与要求详解
  • 【Qt开发】按钮类控件(三)-> QCheckBox
  • mcp_clickhouse代码学习
  • Spring Boot 源码深度解析:揭秘自动化配置的魔法
  • 指定端口-SSH连接的目标(告别 22 端口暴力破解)
  • PNPM库离线安装方案
  • MacOS 15.6 编译SDL3 Android平台多架构so库
  • 鸿蒙:获取UIContext实例的方法
  • 计算机原理-计算机操作系统-硬盘缓存、断电丢数据篇
  • 普通键盘在MacOS上如何使用快捷键
  • 分布式专题——1.1 Redis单机、主从、哨兵、集群部署
  • Redis 持久化机制:RDB 快照深度解析
  • 在选择iOS代签服务前,你必须了解的三大安全风险
  • MCP驱动企业微信智能中枢:企业级机器人服务构建全攻略
  • 期望阻抗模型中的相互作用力方向是机器人施加给环境的还是环境施加给机器人的?
  • bc 命令详解:Linux 下的任意精度计算器
  • B.50.10.06-NoSQL数据库与电商应用
  • 【前端教程】JavaScript DOM 操作实战案例详解
  • 假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符
  • 【数学建模】数据预处理入门:从理论到动手操作
  • 机器学习(七)决策树-分类
  • 汽车软件研发智能化:AI在CI/CD中的实践
  • 有序数组,距离目标最近的k个数 二分查找
  • 函数式组件父子ref通讯
  • AAB包转apks转apk
  • 快速、归并、堆、希尔、ArrayList排序