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

详解MySQL锁机制

        MySQL 的锁机制是数据库并发控制的核心,InnoDB 存储引擎提供了多种锁类型来保证数据的一致性和完整性。下面我将系统性地讲解 MySQL 的锁机制。

1. 锁的基本分类

1.1 按锁的粒度划分

锁类型描述特点常见存储引擎
表锁锁定整张表开销小,加锁快;并发度低MyISAM, InnoDB等
行锁锁定索引记录开销大,加锁慢;并发度高InnoDB
页锁锁定一页(介于表锁和行锁之间)已弃用,被行锁取代BDB(已淘汰)
  • 为什么表锁开销小?

    • 表锁只需在内存中维护一个锁结构(整个表1个锁)。

    • 行锁需要为每行/每个索引条目维护锁结构(可能成千上万个锁)。

  • 为什么行锁并发度高?

    • 表锁:任何写操作会阻塞其他所有读写操作(如UPDATE会阻塞所有SELECT)。

    • 行锁:只有访问同一行的事务会相互阻塞(不同行可并发操作)。

  • InnoDB的锁实现特点

    • 默认使用行锁,但无索引或索引失效时会退化为表锁(例如:UPDATE table WHERE non_index_column=1)。

    • 意向锁(IS/IX)是表级锁,用于快速判断表中是否有行被锁定。

  • 如何避免锁升级?

    • 确保查询走索引:通过EXPLAIN验证。

    • 避免长事务:长时间未提交的事务会持有锁。

  • 经典案例验证

    -- 会话1(使用行锁,有索引)
    BEGIN;
    UPDATE users SET name='张三' WHERE id=1;  -- 只锁定id=1的行-- 会话2(并发操作不受影响)
    UPDATE users SET name='李四' WHERE id=2;  -- 正常执行-- 会话3(无索引退化为表锁)
    UPDATE users SET name='王五' WHERE name='老用户';  -- 若name无索引,会锁定整个表

1.2 按锁的性质划分

锁类型描述兼容性
共享锁(S)读锁,允许多个事务同时读取与S锁兼容,与X锁互斥
排他锁(X)写锁,独占锁,阻止其他任何锁与所有锁都互斥
意向锁表级锁,表明事务将要锁定某些行IS/IX之间兼容

2. InnoDB 行锁详解

2.1 记录锁(Record Lock)

  • 锁定索引中的单条记录

  • 通过索引条件精确匹配时触发

-- 对id=1的记录加X锁
SELECT * FROM users WHERE id = 1 FOR UPDATE;

2.2 间隙锁(Gap Lock)

  • 锁定索引记录之间的间隙

  • 防止幻读问题的关键

  • 只在REPEATABLE READ隔离级别下有效

-- 锁定id在(5,10)区间的间隙
SELECT * FROM users WHERE id BETWEEN 5 AND 10 FOR UPDATE;

2.3 临键锁(Next-Key Lock) 

  • 记录锁 + 间隙锁的组合

  • 锁定记录及记录前面的间隙

  • InnoDB默认的行锁算法

-- 锁定id>=5的记录及前面的间隙
SELECT * FROM users WHERE id >= 5 FOR UPDATE;

2.4 插入意向锁(Insert Intention Lock)

  • 特殊的间隙锁

  • 多个事务在相同间隙插入不同数据时不互相阻塞

3. 表级锁

3.1 意向锁(Intention Lock)

  • 表级锁,表明事务将要锁定表中的某些行

  • 类型:

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

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

3.2 自增锁(AUTO-INC Lock)

  • 特殊表锁,用于自增列插入

  • 保证自增ID连续且唯一

3.3 元数据锁(MDL)

  • 系统自动加锁,保护表结构

  • 访问表时会自动加MDL读锁

  • 修改表结构时会加MDL写锁

http://www.xdnf.cn/news/8479.html

相关文章:

  • Python实现栈和队列及其应用场景解析
  • 继续对《道德经》第57章至第81章进行数学形式化建模
  • 高压电工工作内容详解
  • 【PhysUnits】8 关联常量泛型(constant/mod.rs)
  • Oracle 11g导出数据库结构和数据
  • 基于Java的仓库库存管理系统的设计与实现|参考|1w字+
  • 每日一练,冲进国赛!全国青少年信息素养大赛-图形化编程—省赛真题——小鸡吃东西
  • Java注解运行时访问与处理技术详解
  • 修改nmeaLib库增加北斗(BD)和格洛纳斯(GNSS)解析
  • PostGIS实现栅格数据导出TIFF应用实践【ST_AsTiff】
  • 图纸加密软件的核心优势解析
  • Python多线程编程详解
  • 信号与系统02-信号的时域分析
  • Python训练营打卡 Day25
  • 电路图识图基础知识-电气符号(二)
  • 图片压缩工具 | 需求思考及桌面应用开发技术选型
  • 2025电工杯数学建模竞赛A题 光伏电站发电功率日前预测问题 完整论文+python代码发布!
  • git 暂存功能使用
  • 从数学融智学视域系统地理解《道德经》:前三十七章,道法自然
  • Linux `clear` 命令与 Ctrl+L 快捷键的深度解析与高阶应用指南
  • 爬虫IP代理技术深度解析:场景、选型与实战应用
  • 缓存穿透解析
  • 20250523-BUG:无法加载“GameLib/Framework.h“头文件(已解决)
  • 【window QT开发】简易的对称密钥加解密工具(包含图形应用工具和命令行工具)
  • esp32-idf框架学习笔记/教程
  • 力扣509题:斐波那契数列的解法与代码注释
  • pytdx数据获取:在线获取和离线获取(8年前的东西,还能用吗?)
  • RESTful API 在前后端交互中的作用与实践
  • 晶圆隐裂检测提高半导体行业效率
  • Python之PyCharm安装及使用教程