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

详解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写锁

相关文章:

  • 七彩喜适老化改造:让每个空间成为长者尊严的守护者
  • 广东省省考备考(第十八天5.23)—言语:语句排序题(听课后强化训练)
  • 基于大模型的股骨干骨折全周期预测与诊疗方案研究报告
  • 【MySQL成神之路】MySQL索引相关介绍
  • C++性能测试工具——sysprof的使用
  • FRP技术概览
  • 注册并创建一个微信小程序
  • git初始化及操作指南
  • 《边缘算力困局突破:智能体模型动态调度全解析》
  • 2025年电工杯数学建模竞赛A题的 数据基于Kaggle 的AMS 2013-2014 太阳能预测大赛 (2.8G 数据)
  • 腾讯地图WebServiceAPI提供基于HTTPS/HTTP协议的数据接口
  • JVM——Java 虚拟机的监控及诊断工具(GUI 篇)
  • 信息系统项目管理师考前练习9
  • 关系数据库基础入门
  • 代码随想录算法训练营第四十八天
  • Golang 之 Context 源码解析(1.20+)
  • 贪心算法套路模板+详细适用场景+经典题目清单
  • arcgis js统计FeatureLayer的椭球面积、平面面积
  • Python 实现基于 OpenAI API 的文章标题自动生成评论
  • 【深度学习-Day 16】梯度下降法 - 如何让模型自动变聪明?
  • 怀柔网站整站优化公司/seo课程在哪培训好
  • 大学院系网站建设/北京知名seo公司精准互联
  • 动态网站开发作业/主要推广手段免费
  • 手机wordpress上传失败/aso优化报价
  • 网站建设模块是什么意思/广州百度快速优化排名
  • windows wordpress伪静态/seo优化工作内容