MySql幻读问题

认识具有反复性。

之前以为理解了幻读,最近看黑马的mysql教程以为再次加深了认识。然而现在认为之前的理解都是错误的,而且网上很多关于幻读的解释,都不太准确。

关于幻读的最佳解释还是要看官网mysql官网幻读解释

脏读和不可重复读比较好理解,但有一个容易误解的地方,就是在READ COMMITTED这个隔离级别下,事务A查询某种condition下的结果集为R1,此时事务B插入或者删除了符合这个condition的数据并提交事务。此时事务A再次查询结果集为R2,与R1不一致,个人认为这是幻读,很容易让人以为这是不可重复读。

脏读侧重于读取到了其他事务未提交的数据。而不可重复读侧重于针对单条数据的更新,同一事务中两次查询内容不一致。而幻读侧重于其他事务的插入和删除,导致本事务查询结果集数量和范围不一致。

我们最先认识到的就是MySql隔离级别默认是REPEATABLE READ,这个隔离级别可能出现幻读。由于先入为主,反而容易产生误解,导致很多人在这个隔离级别下演示幻读。然而这个隔离级别下,由于MySql使用了MVCC机制,在事务开启时,会创建一个一致性视图,普通的Select语句即快照读,都是基于这个视图获取数据。这种情况下其他事务无论删除还是插入,都不会影响这个一致性视图。此事务下的普通Select查询结果一致,一定程度上避免了幻读。所以很多教程演示的两次查询结果一致,并没有演示出幻读的现象。当然,很多教程在两次查询中间,会演示事务B插入一条主键为某个值的数据。然后事务A查询这个主键数据不存在,然后做插入操作,结果失败了,然后再次查询结果,这个主键的数据还是不存在。插入失败,会提示主键重复,在insert时会执行当前读,读取的是数据库当前最新的数据,可以查到此主键已经存在,前面查询是不存在的,可以理解为变相的演示出了幻读。

补充

快照读:读取的是事务开启时特定时间点的数据库“快照”数据,基于多版本并发控制(MVCC)机制实现。不管事务执行多久,期间其他事务如何更新提交数据,快照读看到的始终是最初那个时间点的数据版本,保证同一事务内多次读取数据的一致性。例如,在一个长事务中,多次执行普通的SELECT语句,结果都一样。
当前读:读取的是数据库当前最新的、真实的数据状态,无视多版本情况。每次当前读获取的数据反映的都是当下这一瞬间的数据库真实情况,所以不同时间的当前读,获取的数据很可能不同。

执行SELECT… FOR UPDATE 、SELECT… LOCK IN SHARE MODE、UPDATE、DELETE、INSERT语句时,是当前读,因为它们要获取数据库当下最新数据。

在“读已提交”(READ COMMITTED )隔离级别下,MySQL也有MVCC机制,但它无法避免幻读:
在“读已提交”级别,事务每次执行快照读时,都会获取最新已提交事务对应的版本,而非固定在事务开启时的版本。这意味着,新插入并提交的数据能被后续快照读捕捉到,没办法维持同一事务内多次查询结果的稳定性,所以抵御不了幻读。
反观“可重复读”隔离级别,事务开启时生成固定一致性视图,全程基于此视图做快照读,新数据进不来,能较好防控幻读;“读已提交”的MVCC 因频繁更新读取版本,给幻读留了“口子”。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker 搭建集群

准备3台机器: #dockermaster 192.168.31.150 sudo hostnamectl set-hostname dockermaster #初始化主节点 docker swarm init --advertise-addr 192.168.31.150 #查看集群是否搭建成功 docker node ls #dockernode1 192.168.31.151 sudo hostnamectl set-hostname …

Kafka消息不丢失与重复消费问题解决方案总结

1. 生产者层面 异步发送与回调处理 异步发送方式:生产者一般使用异步方式发送消息,异步发送有消息和回调接口两个参数。在回调接口的重写方法中,可通过异常参数判断消息发送状态。若消息发送成功,异常参数为null;若发…

StarRocks 存算分离在得物的降本增效实践

编者荐语: 得物优化数据引擎布局,近期将 4000 核 ClickHouse 迁移至自建 StarRocks,成本降低 40%,查询耗时减半,集群稳定性显著提升。本文详解迁移实践与成果,文末附丁凯剑老师 StarRocks Summit Asia 2024…

微服务-1 认识微服务

目录​​​​​​​ 1 认识微服务 1.1 单体架构 1.2 微服务 1.3 SpringCloud 2 服务拆分原则 2.1 什么时候拆 2.2 怎么拆 2.3 服务调用 3. 服务注册与发现 3.1 注册中心原理 3.2 Nacos注册中心 3.3 服务注册 3.3.1 添加依赖 3.3.2 配置Nacos 3.3.3 启动服务实例 …

IDEA工具使用介绍、IDEA常用设置以及如何集成Git版本控制工具

文章目录 一、IDEA二、建立第一个 Java 程序三、IDEA 常用设置四、IDEA 集成版本控制工具(Git、GitHub)4.1 IDEA 拉 GitHub/Git 项目4.2 IDEA 上传 项目到 Git4.3 更新提交命令 一、IDEA 1、什么是IDEA? IDEA,全称为 IntelliJ ID…

kafka开机自启失败问题处理

前言:在当今大数据处理领域,Kafka 作为一款高性能、分布式的消息队列系统,发挥着举足轻重的作用。无论是海量数据的实时传输,还是复杂系统间的解耦通信,Kafka 都能轻松应对。然而,在实际部署和运维 Kafka 的…

二维数组综合

第1题 稀疏矩阵 查看测评数据信息 nm矩阵大部分元素是0的矩阵称为稀疏矩阵,假设有k个非0元素,则可把稀疏矩阵用K3的矩阵简记之,其中第一列是行号,第二列是列号,第三列是该行、该列下的非0元素的值。如:…

STM32-笔记20-测量按键按下时间

1、按键按下的时间-思路 我们先检测下降沿信号,检测到以后,在回调函数里切换成检测上升沿信号,当两个信号都检测到的时候,这段时间就是按键按下的时间,如图所示:>N*(ARR1)CCRx的值 N是在这段时间内&…

【网络协议】路由信息协议 (RIP)

未经许可,不得转载。 路由信息协议(Routing Information Protocol,简称 RIP)是一种使用跳数(hop count)作为路由度量标准的路由协议,用于确定源网络和目标网络之间的最佳路径。 文章目录 什么是…

PHP后执行php.exe -v命令报错并给出解决方案

文章目录 一、执行php.exe -v命令报错解决方案 一、执行php.exe -v命令报错 -PHP Warning: ‘C:\windows\SYSTEM32\VCRUNTIME140.dll’ 14.38 is not compatible with this PHP build linked with 14.41 in Unknown on line 0 解决方案 当使用PHP8.4.1时遇到VCRUNTIME140.dll…

blender中合并的模型,在threejs中显示多个mesh;blender多材质烘培成一个材质

描述:在blender中合并的模型导出为glb,在threejs中导入仍显示多个mesh,并不是统一的整体,导致需要整体高亮或者使用DragControls等不能统一控制。 原因:模型有多个材质,在blender中合并的时候,…

0xc0000020错误代码怎么处理,Windows11、10坏图像错误0xc0000020的修复办法

“0xc0000020”是一种 Windows 应用程序错误代码,通常表明某些文件缺失或损坏。这可能是由于系统文件损坏、应用程序安装或卸载问题、恶意软件感染、有问题的 Windows 更新等原因导致的。 比如,当运行软件时,可能会出现类似“C:\xx\xxx.dll …

wangEditor富文本插件在vue项目中使用和媒体上传的实现

wangEditor是前端一个比较流行的简洁易用,功能强大的前端富文本编辑器,支持 JS Vue React,提供了很多丰富的功能,下面手把手教你实现wangWditor富文本插件在vue项目中配置,保存、图片上传等功能。无脑ctrlc即可 基本功…

MySQL root用户密码忘记怎么办(Reset root account password)

在使用MySQL数据库的的过程中,不可避免的会出现忘记密码的现象。普通用户的密码如果忘记,可以用更高权限的用户(例如root)进行重置。但是如果root用户的密码忘记了,由于root用户本身就是最高权限,那这个方法…

C语言学习笔记(1)

在学习前,需要有一定的C语言基础。不必很深入,只需要知道函数,头文件,指针,数组等的概念就可以,但并非0基础笔记。 由于写到后面,不好编辑了,决定分成多篇写,请按编号学…

使用uWSGI将Flask应用部署到生产环境

使用uWSGI将Flask应用部署到生产环境: 1、安装uWSGI conda install -c conda-forge uwsgi(pip install uwsgi会报错) 2、配置uWSGI 在python程序的同一文件夹下创建 uwsgi.ini文件,文件内容如下表。 需要按照实际情况修改文件名称…

集成方案 | Docusign + 蓝凌 EKP,打造一站式合同管理平台,实现无缝协作!

本文将详细介绍 Docusign 与蓝凌 EKP 的集成步骤及其效果,并通过实际应用场景来展示 Docusign 的强大集成能力,以证明 Docusign 集成功能的高效性和实用性。 在当今数字化办公环境中,企业对于提高工作效率和提升用户体验的需求日益迫切。蓝凌…

CMS漏洞靶场攻略

DeDeCMS 环境搭建 傻瓜式安装 漏洞一:通过文件管理器上传WebShel 步骤⼀:访问目标靶场其思路为 dedecms 后台可以直接上传任意文件,可以通过⽂件管理器上传php文件获取webshell 登陆网站后台 步骤二:登陆到后台点击 【核心】 --》 【文件式…

1、Jmeter、jdk下载与安装

1、访问官网,点击下载Jmeter http://jmeter.apache.org/ 2、在等待期间,下载对应的Java https://www.oracle.com/cn/java/technologies/downloads/#jdk23-windows 3、全部下载好,先安装JDK ![在这里插入图片描述](https://i-blog.csdnimg…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(二)

****非斜体正文为原文献内容(也包含笔者的补充),灰色块中是对文章细节的进一步详细解释! 3.1.2 基于注意力的解释(Attention-Based Explanation) 注意力机制可以揭示输入数据中各个部分之间的关系&#…