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

MVCC、幻读、间隙锁与临键锁(二)

1. MVCC 解决了什么问题?

MVCC(多版本并发控制)是 MySQL InnoDB 存储引擎实现并发访问的核心机制,主要解决了读写冲突问题:
  • 在传统锁机制中,读操作需要加共享锁,写操作需要加排他锁,会导致 “读阻塞写、写阻塞读”,严重影响并发性能。
  • MVCC 通过维护数据的多个版本,允许读操作(非锁定读)无需加锁即可访问历史版本数据,同时写操作修改当前版本,实现了 “读不阻塞写,写不阻塞读”,大幅提升了数据库的并发处理能力。

2. MySQL 幻读解决了吗?

在 InnoDB 的可重复读(RR)隔离级别下,幻读被有效解决;在读已提交(RC)隔离级别下,幻读仍可能存在。
幻读的定义:同一事务内,连续两次执行相同范围的查询(如SELECT * FROM t WHERE id > 10),第二次查询可能返回第一次未出现的新数据(因其他事务插入了满足条件的记录)。
InnoDB 在 RR 级别通过间隙锁(Gap Lock)和临键锁(Next-Key Lock) 防止其他事务插入新数据,从而避免幻读。

3. MVCC 的原理是什么?

MVCC 通过以下核心组件实现多版本控制:
  • 隐藏列:InnoDB 为每个表添加 3 个隐藏列:
    • DB_TRX_ID:记录最后一次修改该记录的事务 ID;
    • DB_ROLL_PTR:回滚指针,指向该记录的历史版本(存储在 undo log 中);
    • DB_ROW_ID:若表无主键,InnoDB 会自动生成该列作为行唯一标识。
  • undo log:存储数据的历史版本,用于事务回滚和 MVCC 的读操作。当修改记录时,旧版本数据会被写入 undo log,通过DB_ROLL_PTR串联形成版本链。
  • Read View(读视图):每个事务在启动时会生成一个 Read View,用于判断数据版本的可见性。Read View 包含当前活跃事务的 ID 列表,规则如下:
    • 若记录的DB_TRX_ID小于 Read View 中的最小活跃事务 ID,说明该版本在事务启动前已提交,可见;
    • 若记录的DB_TRX_ID大于 Read View 中的最大活跃事务 ID,说明该版本在事务启动后生成,不可见;
    • DB_TRX_ID在活跃事务 ID 范围内,需判断是否为当前事务自身的修改:是则可见,否则不可见。
通过以上机制,事务可以访问符合条件的历史版本,实现非阻塞读。

4. 间隙锁(Gap Lock)和临键锁(Next-Key Lock)解决了什么问题?怎么解决的?原理是什么?

解决的核心问题:

两者均用于防止幻读,本质是通过锁定 “数据间隙” 阻止其他事务插入新记录,确保同一事务内多次查询的范围一致性。

(1)间隙锁(Gap Lock)

  • 定义:锁定索引记录之间的 “间隙”(不包含记录本身),防止其他事务在间隙中插入新数据。
  • 原理:
     
    例如,表tid索引值为 10、20、30,当执行SELECT * FROM t WHERE id BETWEEN 10 AND 30 FOR UPDATE时,InnoDB 会锁定以下间隙:
    • (负无穷,10)
    • (10, 20)
    • (20, 30)
    • (30, 正无穷)
       
      其他事务无法在这些间隙中插入id=15id=25等新记录,从而避免 “新增数据导致幻读”。

(2)临键锁(Next-Key Lock)

  • 定义:InnoDB 默认的行级锁机制,是 “行锁(Record Lock)+ 间隙锁(Gap Lock)” 的组合,锁定索引记录本身及其前面的间隙。
  • 原理:仍以id索引 10、20、30 为例,临键锁的锁定范围是左开右闭区间:
    • (-∞, 10]
    • (10, 20]
    • (20, 30]
    • (30, +∞)
       
      例如,当锁定id=20时,临键锁会同时锁定记录id=20(行锁)和间隙 (10,20)(间隙锁),既防止修改id=20的记录,也防止在 (10,20) 中插入新数据。
  • 作用:临键锁是 InnoDB 在 RR 级别下默认使用的锁,通过同时锁定记录和间隙,彻底阻止 “修改已有记录” 和 “插入新记录” 两种可能导致幻读的操作。

总结

  • MVCC 解决读写冲突,通过多版本实现非阻塞读;
  • InnoDB 在 RR 级别通过间隙锁和临键锁解决幻读;
  • 间隙锁锁定数据间隙,临键锁锁定记录 + 间隙,两者共同防止其他事务插入新数据,保障范围查询的一致性。
http://www.hskmm.com/?act=detail&tid=32031

相关文章:

  • 读AI赋能01超级能动性
  • 生物聚酯塑料回收技术创新与商业应用
  • 189 轮转数组 - MKT
  • SGD 到 AdamW 优化器的实践选型指南
  • 图文并茂展示CSS li 排版大合集,总有一款是你刚好需要的
  • 10.15 闲话
  • 函数的类型注释器
  • 如何手动构建一个线性回归模型
  • DshanPI-A1 RK3576 gmrender-resurrect B站投屏
  • 组件级异步加载与预加载策略
  • 好记性不如烂笔头之C语言优先级查询
  • SAM系列论文浅析
  • 2023 ICPC Xian
  • 2025-10-15 ?
  • 为什么一部电影,一本书一看就喜欢
  • 20251015打卡
  • 实验一 现代C++编程初体验
  • p66页2
  • 牛客119232 牛客2025秋季算法编程训练联赛1-提升组 游记
  • BroadcastChannel跨页签通信复盘总结
  • 02020510 EF Core高级10-构建动态表达式树、不推荐动态构建表达式树、动态构建IQuerable、动态构建字符串
  • 02020601 Web API01-顶级语句、全局using指令、可空类型、record类型(自动重写ToString、Equals)、init和private属性
  • OI 生涯回忆录
  • libaom 在ubuntu 上用鸿蒙OHOS编译
  • Aexlet-VGG2
  • 《膜拜!适合新手入门的卷积神经网络原理详解教程》读书报告
  • 科学与社会研讨课笔记
  • p66 实训2
  • 公众号排版用什么好?一次技术视角的系统拆解:效率、兼容与智能协同
  • Linux系统下对拍