『MySQL 实战 45 讲』20 - 幻读是什么,幻读有什么问题?

幻读是什么,幻读有什么问题?

  1. 需求:创建一个小表
CREATE TABLE `t` (`id` int(11) NOT NULL,`c` int(11) DEFAULT NULL,`d` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `c` (`c`)
) ENGINE=InnoDB;insert into t values(0,0,0),(5,5,5),
(10,10,10),(15,15,15),(20,20,20),(25,25,25);

幻读是什么?

  1. 幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行
  2. 幻读说明:
  • 在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。因此,幻读在“当前读”下才会出现

幻读有什么问题?

  1. 语义上会被破坏
  2. 产生数据不一致性

幻读带来的问题分析

  1. 假设需要对 id=5 这一行加锁,其他行不加锁(这个是个假设场景)
    在这里插入图片描述
  • T1 时刻,Q1 只返回 id=5 这一行(因为假设只锁一行)
  • T2 时刻,session B 把 id=0 这一行的 d 值改成了 5,因此 T3 时刻 Q2 查出来的是 id=0 和 id=5 这两行
  • T4 时刻,session C 又插入一行(1,1,5),因此 T5 时刻 Q3 查出来的是 id=0、id=1 和 id=5 的这三行
  1. 其中因为当前读,session C 新插入的行被 session A 看到了,这就是幻读
  2. 问题一:语义被破坏
  • 实际上,session A 在 T1 时刻,就要求锁住 d=5 的行。由于只锁住 id=5 这一行,T2 时刻 session B 是可以执行 2 条 update 语句,破坏了 Q1 的声明(session C 同理)
  1. 问题二:数据一致性问题(数据和日志在逻辑上的一致性)
    在这里插入图片描述
  • 执行逻辑:
    • T1 时刻:id=5 这一行变成 (5,5,100),当然这个结果最终是在 T6 时刻正式提交的
    • T2 时刻,id=0 这一行变成 (0,5,5)
    • T4 时刻,表里面多了一行 (1,5,5)
  • 对应 binlog 里面的内容:
update t set d=5 where id=0; /*(0,0,5)*/
update t set c=5 where id=0; /*(0,5,5)*/insert into t values(1,1,5); /*(1,1,5)*/
update t set c=5 where id=1; /*(1,5,5)*/update t set d=100 where d=5;/*所有d=5的行,d改成100*/
  • binlog 语句序列问题
    • 不论是拿到备库去执行,还是以后用 binlog 来克隆一个库,这三行的结果,都变成了 (0,5,100)、(1,5,100) 和 (5,5,100)
    • id=0 和 id=1 这两行,发生了数据不一致
    • 引起该问题的是 for update 只给 d=5 这行加锁
  • 解决 binlog 语句序列问题:
    在这里插入图片描述
  • 执行逻辑:
    • session A 把所有的行都加了写锁,session B 在执行第一个 update 就会被锁住,只有 T6 时刻 session A 提交以后,session B 才能继续执行
    • 新的 binlog 日志执行顺序如下
insert into t values(1,1,5); /*(1,1,5)*/
update t set c=5 where id=1; /*(1,5,5)*/update t set d=100 where d=5;/*所有d=5的行,d改成100*/update t set d=5 where id=0; /*(0,0,5)*/
update t set c=5 where id=0; /*(0,5,5)*/
  • 虽然 session B 更新的问题已经解决,但是 session C 插入时,id=1 这一行还不存在,不存在也就加不上锁。也就是说,即使把所有的记录都加上锁,还是阻止不了新插入的记录

如何解决幻读?

  1. 为了解决幻读问题,InnoDB 只好引入新的锁,也就是间隙锁
  2. 实际上,开头的表 t,初始化插入了 6 个记录,这就产生了 7 个间隙

极客时间版权所有: https://time.geekbang.org/column/article/75173
3. 当执行 select * from t where d=5 for update 的时候,6 个记录加上了行锁,还同时加了 7 个间隙锁,这样就确保无法再插入新的记录
4. 注意:跟间隙锁存在冲突关系的,是“往这个间隙中插入一个记录”这个操作
在这里插入图片描述

  • 这里 session B 并不会被堵住,因为表 t 里并没有 c=7 这个记录,因此 session A 加的是间隙锁 (5,10)
  1. 间隙锁和行锁合称 next-key lock,每个 next-key lock 是前开后闭区间
  • 如果用 select * from t for update 要把整个表所有记录锁起来,就形成了 7 个 next-key lock,分别是 (-∞,0]、(0,5]、(5,10]、(10,15]、(15,20]、(20, 25]、(25, +supremum]
  1. 间隙锁和 next-key lock 的引入,解决了幻读的问题,但同时也带来了一些问题
  • 例如下面这个逻辑
begin;
select * from t where id=N for update;/*如果行不存在*/
insert into t values(N,N,N);
/*如果行存在*/
update t set d=N set id=N;commit;
  • 一旦有并发,就有可能死锁
    在这里插入图片描述
  • 执行逻辑
    • session A 执行 select … for update 语句,由于 id=9 这一行并不存在,因此会加上间隙锁 (5,10)
    • session B 执行 select … for update 语句,同样会加上间隙锁 (5,10),间隙锁之间不会冲突,因此这个语句可以执行成功
    • session B 试图插入一行 (9,9,9),被 session A 的间隙锁挡住了,只好进入等待
    • session A 试图插入一行 (9,9,9),被 session B 的间隙锁挡住了
  • 间隙锁的引入,可能会导致同样的语句锁住更大的范围,这其实是影响了并发度的
  1. 间隙锁是在可重复读隔离级别下才会生效的
  • 如果把隔离级别设置为读提交的话,就没有间隙锁了
  • 解决可能出现的数据和日志不一致问题,需要把 binlog 格式设置为 row
    • binlog row 记录的不是 sql,和 sql 顺序无关,不会导致主从数据不一致

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3019726.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

TriCore User Manual 笔记 1

说明 本文是 英飞凌 架构文档 TriCore TC162P core archiecture Volume 1 of 2 (infineon.com) 的笔记,稍作整理方便查阅,错误之处,还请指正,谢谢 :) 1. Architecture 2. General Purpose & System Register 名词列表&#…

探索数据结构

什么是数据结构 数据结构是由:“数据”与“结构”两部分组成 数据与结构 数据:如我们所看见的广告、图片、视频等,常见的数值,教务系统里的(姓名、性别、学号、学历等等); 结构:当…

远动通讯屏功能和作用

远动通讯屏功能和作用 首先大家要先了解,什么叫远动通讯?远动通讯是电力系统指用于远程通信和远程控制的设备。它主要采集电发场站的电气运行参数与远程调度监控中心进行数据交互,并接收调度中心远程的指令控制。提高电力系统的运行效率和可靠…

使用perf查看热点函数和系统调用最大延迟函数

1、安装perf工具 1.1、ubuntu 18.04 x86下的安装 安装sudo apt install linux-source sudo apt install linux-tools-uname -r # ubuntu 18.04虚拟机实操可行 1.2、ubuntu 18.04 ARM下的安装 参考 Nvidia Jetson系列产品安装Perf ​ARM64版本的Ubuntu上安装perf 与参考文…

汽车灯罩使用聚碳酸酯(PC)和PMMA(亚克力)哪个更好?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车灯罩使用聚碳酸酯(PC)和PMMA(亚克力)哪个更好? 聚碳酸酯(PC)和PMMA(亚克力)都是汽车灯罩常见的材质,它们各自具有独特的优点和特性,因此选择…

更专业的汽车软件研发工具链,怿星重磅发布新产品

怿星科技在2024北京国际车展同期举办主题为“创新引领未来——聚焦智能汽车软件新基建”的新产品发布会,重磅推出1款绝对优势产品和4套场景解决方案。同时举行了4场热点技术研讨:国产工具链的机遇与挑战、新架构下的的车载DDS应用探索及测试方案介绍、软…

微店商品详情API接口:打造个性化电商体验的利器

前言 随着电子商务的快速发展,越来越多的商家开始注重线上店铺的个性化建设和用户购物体验的优化。在这个过程中,API(应用程序接口)技术发挥着至关重要的作用。本文将重点介绍微店商品详情API接口,探讨其如何帮助商家提…

高压开关柜局部放电监测装置APD

安科瑞薛瑶瑶18701709087/17343930412 APD系列高压柜局部放电监测装置通过检测伴随局部放电而产生的电磁波辐射,实时监测的开关柜内局部放电的放电次数和放电频次等数据,对电气设备绝缘状况进行评估,发现设备潜伏性故障,最终实现…

docker 方式 elasticsearch 8.13 简单例子

安装 docker 虚拟机安装 elastic search 安装本地 # 创建 elastic 的网络 docker network create elastic # 用镜像的方式创建并启动容器 docker run -d --name es --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e "xpack.secur…

API开发淘宝(京东)API接口:获取淘宝京东等平台数据的api接口分享

接口应用场景——电商产品定价 电商平台产品的定价问题是很多品牌非常重视的一个问题,产品的定价取决于很多因素,包括成本、供需情况、促销策略及竞争对手的价格等。因此,想要更合理地定价,品牌需要获取到影响产品定价的各类数据&…

【Linux】17. 进程间通信 --- 管道

1. 什么是进程间通信(进程间通信的目的) 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了…

团队执行力差,多半都是管理的问题

在日常管理中,我们习惯用“执行力好不好”来评价一个团队的表现,但实际上,执行力更应该是一个管理者需要思考和解决的问题,而非单纯归咎于团队。 我们需要明确一点:执行力不是团队的问题,而是管理者的问题…

比亚迪CAN数据实时监控分析应用数字化差异化的决策价值洞察

在当今这个信息化飞速发展的时代,汽车数字化转型已成为企业持续竞争力的关键。中国新能源汽车行业的领军企业——比亚迪,其数字化之旅充分展现了企业的创新精神和对未来的深远洞察。 比亚迪的数字化战略不是简单的技术应用,而是一场深刻的商…

C++奇迹之旅:string类对象的容量操作

文章目录 📝 string类的常用接口🌉 string类对象的容量操作🌠size🌠length🌠capacity🌠clear🌠empty🌠reserve🌉resize 🚩总结 📝 string类的常用…

大数据集成平台建设方案-word原件资料

基础支撑平台主要承担系统总体架构与各个应用子系统的交互,第三方系统与总体架构的交互。需要满足内部业务在该平台的基础上,实现平台对于子系统的可扩展性。基于以上分析对基础支撑平台,提出了以下要求: (1) 基于平台的基础架构&…

【优选算法】——Leetcode——611. 有效三角形的个数

目录 ​编辑 1.题目 2 .补充知识 3.解法⼀(暴⼒求解)(可能会超时): 算法思路: 算法代码: 4.解法⼆(排序双指针): 算法思路: 以输入: nums …

多个glibc库存在时如何查看ldd调用的哪个

但是发现存在多个版本的glibc版本,需要查看具体的库的信息,和相应的关键函数的信息,但是并不知道具体的libc.so.6的路径信息 rootalg-dev04:~/xingqiao# ldd --version ldd (GNU libc) 2.29 rootalg-dev04:/opt# which ldd /usr/local/bin/…

硬件基础——晶振(复试被问到)

1.什么是晶振 石英晶体振荡器,是芯片的心脏,主要用于提供给芯片稳定、精确的时钟频率信号。其主要利用石英晶体的压电效应,从而实现振荡。 一般晶振会在芯片的旁边,不能远离晶振,因为振荡时会受外界电磁干扰的影响。 我…

LLM——大语言模型完整微调策略指南

1、 概述 GPT-4、LaMDA、PaLM等大型语言模型(LLMs)以其在广泛主题上的深入理解和生成高度类人文本的能力而闻名遐迩,它们在全球范围内引起了广泛关注。这些模型的预训练过程涉及对来自互联网、书籍和其他来源的数十亿词汇的海量数据集进行学…

如何阅读:一个已被证实的低投入高回报的学习方法的笔记

系列文章目录 如何有效阅读一本书笔记 如何阅读:一个已被证实的低投入高回报的学习方法 麦肯锡精英高效阅读法笔记 读懂一本书笔记 文章目录 系列文章目录第一章 扫清阅读障碍破解读不快、读不进去的谜题一切为了阅读小学教师让你做,但中学老师阻止你做的…