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

MySQL的innoDB存储引擎如何解决幻读的问题?

MySQL的innoDB存储引擎如何解决幻读的问题

基本情况

  1. MySQL有四种事务隔离级别,这四种隔离级别代表当存在多个事务并发冲突时,可能出现的脏读、不可重复读、幻读的问题
  2. InnoDB 在 RR 的隔离级别下 ,解决了幻读的问题
  3. 幻读是指在同一个事务中,前后两次查询相同的范围时,得到的结果数不一致

原理分析

  1. InnoDB 引入了间隙锁和 next-key Lock 机制来解决幻读问题
  2. 通过主键索引查询一条记录 ,并且对这条记录通过for update加锁,这个时候,会产生一个记录锁 ,也就是行锁
  3. 如果是范围查询 加 for update,其它事务执行 insert 语句,要被阻塞,直到前面获得锁的事务释放
  4. 在 InnoDB 中设计了一种间隙锁,它的主要功能是锁定一段范围内的索引记录
  5. 例如:当对查询范围 id > 4 and id < 7 加锁,会对B+树中 4, 7 的开区间索引加间隙锁,其他事务对这个区间的数据进行插入、更新、删除都会被锁住
  6. 如果查询范围是 id > 4,则会锁住多个索引区间,因此引入 next-key Lock 机制
  7. next-key Lock 相当于间隙锁和记录锁的合集,记录锁锁定存在的记录行 ,间隙锁锁住记录行之间的间隙 ,而 next-key Lock 锁住的是两者之和

临键锁

  1. 临键锁 也称为行级锁或行锁,是数据库管理系统中的一种锁机制,用于在并发环境下对数据库表中的行进行精确控制和保护
  2. 临键锁的作用范围是数据库表中的单行记录,相比表级锁或页级锁,临键锁的粒度更细,可以最大程度地提高并发性能
  3. 使用临键锁可能会发生死锁情况,即两个或多个事务互相等待对方释放锁,为了避免死锁,数据库管理系统通常会实现死锁检测和解决机制

不可重复读和幻读的区别是?

  1. 不可重复读 指的是在同一事务内,对于相同的查询条件,多次读取得到的结果不一致。这是由于其他并发事务在读取期间修改了数据造成的。例如,事务A首先读取某一行数据,然后事务B修改了该行数据,最后事务A再次读取同一行数据时,发现数据已经发生变化,导致结果不一致。
  2. **幻读 **则指的是在同一事务内,对于相同的查询条件,多次读取得到的结果集合大小不一致。这是由于其他并发事务在读取期间插入或删除了满足查询条件的数据造成的。例如,事务A首先执行了一个查询语句,返回了一组结果,接着事务B插入了满足相同查询条件的新数据,最后事务A再次执行相同的查询语句,发现结果集中新增了数据,导致结果集合大小不一致。
  3. 不可重复读主要涉及到同一行数据在事务内被修改,导致读取结果不一致;而幻读则涉及到符合查询条件的整个结果集合在事务内被插入或删除,导致结果集合大小不一致。
http://www.lryc.cn/news/108295.html

相关文章:

  • Web3.0:重新定义互联网的未来
  • 2023年还能选择前端吗?
  • sheetJs / xlsx-js-style 纯前端实现导出 excel 表格及自定义单元格样式
  • Redis 报错 RedisConnectionException: Unable to connect to x.x.x.x:6379
  • Stable Diffusion - 真人照片的高清修复 (StableSR + GFPGAN) 最佳实践
  • 细讲一个 TCP 连接能发多少个 HTTP 请求(一)
  • 了解 CVSS:通用漏洞评分系统的应用
  • Xilinx FPGA电源设计与注意事项
  • 前端:地图篇(一)
  • 刷题笔记 day6
  • Drools用户手册翻译——第四章 Drools规则引擎(十一)复杂事件处理(CEP)的属性更改设置和监听器
  • [数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北
  • 基于SpringBoot+Vue的MOBA类游戏攻略分享平台设计与实现(源码+LW+部署文档等)
  • Linux sed 命令详解
  • 算法通关村——如何使用中序和后序来恢复一棵二叉树
  • TypeScript的基本类型
  • Docker实战-如何去访问Docker仓库?
  • 【力扣】722. 删除注释
  • 篇二:工厂方法模式:灵活创建对象
  • Python(六十二)字典元素的增、删、改操作
  • 从零学算法138
  • CTF PWN练习之返回地址覆盖
  • OpenCV中图像变换
  • wordpress发表文章时报错: rest_cannot_create,抱歉,您不能为此用户创建文章(已解决)
  • 数学建模学习(7):Matlab绘图
  • CSS中所有选择器详解
  • STM32 低功耗学习
  • HCIP--云计算题库 V5.0版本
  • 小白到运维工程师自学之路 第六十五集 (docker-compose)
  • 量子机器学习