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

MySQL 间隙锁避免“可重复读”出现“幻读”

在数据库事务处理中,可重复读(Repeatable Read)是一个常用的隔离级别,但其默认行为可能导致幻读现象。然而,在 MySQL 的实现中,通过 **间隙锁(Gap Lock)**机制,能够避免幻读的发生。

为什么“可重复读”可能出现幻读?

1. 幻读的定义

幻读是指在事务中,查询某个范围的数据时,发现另一个事务插入了新的记录,这些记录满足查询条件但在事务开始时并不存在。

例如:

  • 事务 A:执行 SELECT * FROM employees WHERE salary > 5000;,结果返回 5 条记录。
  • 事务 B:插入了一条新记录,其 salary = 6000
  • 事务 A 再次执行相同查询,发现结果变为 6 条记录。

这种新增的数据在事务开始时并不存在,因此称为幻读。

2. 可重复读的不足

在“可重复读”级别:

  • 行锁(Record Lock) 保护的是具体的记录,防止其他事务对已存在记录的修改或删除。
  • 但查询范围内的“间隙”并未锁定,因此允许其他事务在间隙中插入新数据,导致幻读。

MySQL 的间隙锁如何避免幻读?

在 MySQL 的 InnoDB 存储引擎中,“可重复读”通过实现 Next-Key Lock(间隙锁 + 行锁) 机制解决幻读问题。

1. 间隙锁(Gap Lock)

  • 定义:间隙锁是指在索引范围的“间隙”上加锁,防止其他事务在该范围内插入新记录。
  • 例如,查询 SELECT * FROM table WHERE id > 10 AND id < 20;,间隙锁会锁住 (10, 20) 范围,防止其他事务在此范围内插入新数据。

2. Next-Key Lock 机制

  • Next-Key Lock 是行锁与间隙锁的组合。
  • 在“可重复读”级别,MySQL 对范围查询加锁时,会锁定:
    • 已存在的行(行锁)。
    • 范围间隙(间隙锁)。
  • 这种机制避免了其他事务在查询范围内插入新数据,从而杜绝幻读。

3. 示例

假设表 employees 有记录 id=1, 2, 3

  • 事务 ASELECT * FROM employees WHERE id > 1; 锁定范围 (1, ∞)
  • 事务 B:尝试 INSERT INTO employees VALUES (4, ...); 会被阻塞,因为事务 A 的间隙锁覆盖了这个范围。

总结

  1. 可重复读导致幻读
    • 可重复读级别中的行锁仅保护已存在记录,未锁定查询范围的“间隙”,导致可能插入新记录而出现幻读。
  2. MySQL 的解决方案
    • MySQL 的 Next-Key Lock(间隙锁 + 行锁) 机制,在“可重复读”级别下,防止在查询范围内插入新数据,从而避免幻读。
  3. 注意事项
    • 间隙锁仅在 事务隔离级别为可重复读或更高时启用。
    • 在性能与隔离性之间,需要根据实际业务需求权衡是否使用这种机制。
http://www.lryc.cn/news/517329.html

相关文章:

  • 揭秘区块链隐私黑科技:零知识证明如何改变未来
  • JavaWeb开发:从入门到精通
  • 2025年01月07日Github流行趋势
  • c#集成npoi根据excel模板导出excel
  • Vue2移动端(H5项目)项目封装switch组件支持动态设置开启关闭背景色、值及组件内显示文字描述、禁用、switch 的宽度
  • MATLAB语言的语法糖
  • 数字IC设计高频面试题
  • OpenCV 4.5至4.10版本更新概述
  • OSPF - LSA对照表
  • 游戏引擎学习第77天
  • 【项目实战1】五子棋游戏
  • HTML5 动画效果:淡入淡出(Fade In/Out)详解
  • Conmi的正确答案——Cordova使用“src-cordova/config.xml”编辑“Android平台”的“uses-permission”
  • 在Mysql环境下对数据进行增删改查
  • Spring 设计模式:经典设计模式
  • OneFlow和PyTorch在性能上有哪些区别?
  • win下搭建elk并集成springboot
  • H7-TOOL固件2.27发布,新增加40多款芯片脱机烧录,含多款车轨芯片,发布LUA API手册,CAN助手增加负载率,错误状态信息检测
  • STM32+WIFI获取网络时间+8位数码管显示+0.96OLED显
  • 以太网ICMP协议(ping指令)——FPGA学习笔记25
  • 从零手写线性回归模型:PyTorch 实现深度学习入门教程
  • 【Cesium】自定义材质,添加带有方向的滚动路线
  • C 语言奇幻之旅 - 第11篇:C 语言动态内存管理
  • IDEA 撤销 merge 操作(详解)
  • swarm天气智能体调用流程
  • LED背光驱动芯片RT9293应用电路
  • 二叉树的二叉链表和三叉链表
  • 【学习路线】Python 算法(人工智能)详细知识点学习路径(附学习资源)
  • C++直接内存管理new和delete
  • Linux 内核中网络接口的创建与管理