Mysql加锁过程详解(2)-关于mysql 幻读理解

安全工具 | Burp Suite专业版本安装配置及使用指导 Burp Suite是用于攻击web应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快应用程序的安全测试。全球70000多名安全专业人员选择了Burp Suite,同时也是黑客常用一款渗透利器。 阅读详情
首先,mysql 幻读并非是”一个事务内进行两次相同操作居然得到了不一样的结果”,因为它根本不可能发生在使用了 read view / MVCC 的 RR 隔离级别下,这种幻读的定义更适合给 Oracle,Oracle 的事务隔离只有两级,RC 和 Serializable。然后还有很多人辩解说不可重复读是针对某条记录的,幻读是针对记录集合的,这是在自我安慰么?

这里给出 mysql 幻读的比较形象的场景:

 

users: id 主键

1、T1:select * from users where id = 1;

2、T2:insert into `users`(`id`, `name`) values (1, 'big cat');

3、T1:insert into `users`(`id`, `name`) values (1, 'big cat');

 

T1 :主事务,检测表中是否有 id 为 1 的记录,没有则插入,这是我们期望的正常业务逻辑。

T2 :干扰事务,目的在于扰乱 T1 的正常的事务执行。

 

在 RR 隔离级别下,1、2 是会正常执行的,3 则会报错主键冲突,对于 T1 的业务来说是执行失败的,这里 T1 就是发生了幻读,因为T1读取的数据状态并不能支持他的下一步的业务,见鬼了一样。

在 Serializable 隔离级别下,1 执行时是会隐式的添加 gap 共享锁的,从而 2 会被阻塞,3 会正常执行,对于 T1 来说业务是正确的,成功的扼杀了扰乱业务的T2,对于T1来说他读取的状态是可以拿来支持业务的。

 

所以 mysql 的幻读并非什么读取两次返回结果集不同,而是事务在插入事先检测不存在的记录时,惊奇的发现这些数据已经存在了,之前的检测读获取到的数据如同鬼影一般。

这里要灵活的理解读取的意思,第一次select是读取,第二次的 insert 其实也属于隐式的读取,只不过是在 mysql 的机制中读取的,插入数据也是要先读取一下有没有主键冲突才能决定是否执行插入。

不可重复读侧重表达 读-读,幻读则是说 读-写,用写来证实读的是鬼影。

 

下面例子版本

SELECT VERSION();

 

 

 

例子1,读提交

                                                       a

b

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

SET AUTOCOMMIT=0;

1.不可重复读

begin

begin

INSERT test VALUES(1,1);

 

SELECT * FROM test;

 

 这说明在读已提交的隔离级别中,对于各个事务之间在未提交事务之前的插入查询是隔离的,所以不会出现脏读

SELECT * FROM test;

 

 

 

commit

 

 

SELECT * FROM test;

 

 

 

 

COMMIT

B在一个事务的查询的结果变了,不可重复读(这个就是出现了幻读)

2.锁

begin

begin

INSERT test VALUES(2,2);

 

 

SELECT * FROM test;

 

 

 

INSERT test VALUES(2,2);

 

Lock wait timeout exceeded; try restarting transaction

COMMIT

COMMIT

 加锁的情况下会出现死锁的情况

 

begin

 

INSERT test VALUES(3,3);

 

INSERT test VALUES(4,4);

 

COMMIT

 

 

BEGIN

BEGIN

SELECT COUNT(*) FROM test WHERE a>2;

 

SELECT COUNT(*) FROM test WHERE a>2;

 

   

INSERT test VALUES(5,5);

 

SELECT COUNT(*) FROM test WHERE a>2;

 

SELECT COUNT(*) FROM test WHERE a>2;

 

   

COMMIT

 

SELECT COUNT(*) FROM test WHERE a>2;

SELECT COUNT(*) FROM test WHERE a>2;

 

 

 

 

 

 

 

例子2:重复读

 

                                                       a

b

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SET AUTOCOMMIT=0;

1.可重复读

begin

begin

INSERT test VALUES(1,1);

 

SELECT * FROM test;

 

 

SELECT * FROM test;

 

 

 

commit

 

 

SELECT * FROM test;

 

 

 

 

COMMIT(这是由于可重复读的隔离级别保证了每次读到的结果都是一致的)

 

BEGIN

 

SELECT * FROM test;

 

 

 

 

COMMIT

B在一个事务中的查询结果没有改变

2锁

begin

begin

INSERT test VALUES(2,2);

 

 

SELECT * FROM test;

 

 

 

INSERT test VALUES(2,2);

 

Lock wait timeout exceeded; try restarting transaction

COMMIT

COMMIT(这块造成死锁的原因一定要弄明白?)

3(幻读)

BEGIN

BEGIN

INSERT test VALUES(3,3);

 

SELECT * FROM test;

 

 

SELECT * FROM test;

 

 

COMMIT

 

 

SELECT * FROM test;

 

 

 

INSERT test VALUES(3,3);

 

Duplicate entry '3' for key 'PRIMARY'

 

COMMIT

 

BEGIN

 

SELECT * FROM test;

 

 

 

COMMIT

幻读,b明明查到没有,插入时候提示主键冲突,刚刚查询没有,出现幻觉?

 

 

 

 

begin

 

INSERT test VALUES(4,4);

 

COMMIT

4.可重复读

BEGIN

BEGIN

SELECT COUNT(*) FROM test WHERE a>2;

 

SELECT COUNT(*) FROM test WHERE a>2;

 



INSERT test VALUES(5,5);

 

SELECT COUNT(*) FROM test WHERE a>2;

 

SELECT COUNT(*) FROM test WHERE a>2;

 



COMMIT

 

BEGIN

 

SELECT COUNT(*) FROM test WHERE a>2;

SELECT COUNT(*) FROM test WHERE a>2;

 

 

 

 

COMMIT

COMMIT

 


原文链接: http://www.cnblogs.com/crazylqy/p/7612230.html









抓包工具(五)2025版 Burp Suite Professional的下载、安装、使用 阅读详情

相关推荐

BurpSuite2024.7.3专业版

Burp Suite是一个无需安装软件,下载完成后,直接从命令行启用即可。开箱即可使用支持LInux/Windows/Mac

2301_76786857的博客 1621

Burp_Suite_Professional_2023安装和谐过程

Burp Suite Pro 2023(适用最新版本)的安装 以及 和谐过程

ViniJack的博客 2031

你知道MySQL是如何解决幻读的吗?

SQL标准中定义了4种隔离级别,分别是读未提交、读已提交、可重复读以及序列化。不同的隔离级别下,可以解决不同的并发问题,如下图所示。当然MySQL也基本遵循了这个标准,但是在实现上稍有不同。本文重点探讨下MySQL是如何解决幻读问题的,首先串行化隔离级别铁定是可以解决所有的并发问题,相当于每个事务按顺序执行,但是性能很差,不是本文重点讨论对象。实际上MySQL默认的事务隔离级别是可重复读,难道这种隔离级别下MySQL就不管幻读问题了吗?其实不是的,本文就带大家一起看看。

m0_71777195的博客 8422

Burp Suite Professional 2020保姆级详细安装手册

Burp Suite Professional保姆级详细安装手册 介绍一下Burp Suite Professional是做啥的? Burp Suite Professional 2020是一款新推出的全新版本渗透测试工具软件,它主要是用于测试网络的安全性,操作简单,使用也很方便,帮助用户快速、有效的进行网络安全测试。 使用Burp Suite Professional软件前需要有java环境 进入主题,让我们来安装软件吧 破解教程 1.拿到软件安装包,解压文件,点击burp-loader-keyge

weixin_42857656的博客 1万+

MySQL可重复读级别能够解决幻读吗

引言 之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题。为了更好的理解所以在MySQL数据库中测试复现这些问题。关于脏读和不可重复读在相应的隔离级别下都很容易的复现了。但是对于幻读,我发现在可重复读的隔离级别下没有出现,当时想到难道是MySQL对幻读做了什么处理? 测试: 创建一张测试用的表dept: ​​CREATE​​​ ​​TABLE​​​ ​​`dept` (​​ ​​`id` ​​​​int​​​​(11) ​​​​NOT​​​ ​​NULL​​​ ​​AUTO

Moonxiyue的博客 2401

面试官:MySQL是如何解决幻读的?

介绍 众所周知,在不同隔离级别下,会发生如下问题。 √ 为会发生,×为不会发生 隔离级别 脏读 不可重复读 幻读 read uncommitted(未提交读) √ √ √ read committed(提交读) × √ √ repeatable read(可重复读) × × √ serializable (可串行化) × × × 不知道这些问题是如何产生的,可以看如下文章《面试官:脏读,不可重复读,幻读是如何发生的?》 那么mysql是如何避免脏读,不可重复度,幻读的?其实.

小识的博客 2976

Mysql加锁过程详解 (2)- 关于mysql 幻读的理解

首先,mysql 幻读并非是”一个事务内进行两次相同操作居然得到了不一样的结果”,因为它根本不可能发生在使用了 read view / MVCC 的 RR 隔离级别下,这种幻读的定义更适合给 Oracle,Oracle 的事务隔离只有两级,RC 和 Serializable。然后还有很多人辩解说不可重复读是针对某条记录的,幻读是针对记录集合的,这是在自我安慰么? 这里给出 mysql 幻读的比较形象的场景: users: id 主键 1、T1:select * from users where .

qq_23107097的博客 288

abaqus运行报错 WindowsError:[Error 2]

abaqus提交job总是提示“WindowsError [Error 2”,报这个错误,可能是由于安装其他软件改变了abaqus软件的路径导致,总结了看到的教程,按照下面的方法可以解决这个问题。 步骤一:找到你的abaqus安装路径(我是按照一个安装视频安装的,安装路径为SIMULI1),然后找到SIMULIA文件夹,点击进入后找到commands文件夹,将这个路径复制下来。 步骤二:我的电脑右键属性,在左侧中找到高级系统设置并...

az101za的博客 1万+

mysql安慰_Mysql加锁过程详解(2)-关于mysql 幻读理解

这里给出 mysql 幻读的比较形象的场景:users: id 主键1、T1:select * from users where id = 1;2、T2:insert into `users`(`id`, `name`) values (1, 'big cat');3、T1:insert into `users`(`id`, `name`) values (1, 'big cat');T1 :主事...

weixin_31952675的博客 104

第七章-分布式搜索引擎-ES:全文查询、分词查询、精确查询、地理坐标查询、组合查询(bool、funtion_score)以及RestApi

111

weixin_36580930的博客 1633

SPAD 单光子雪崩二极管

SPAD,全称为,是一种高灵敏度的光电探测器件,能够在非常低的光照水平下检测单个光子。SPAD在工作时,当一个光子被探测器吸收后,能够触发一个雪崩效应,产生一个可以被检测到的电信号。

qq_42786033的博客 1万+

一文详解脏读、不可重复读、幻读

MySQL 是支持多事务并发执行的。否则来一个事务处理一个请求,处理一个人请求的时候,其它事务都等着,那估计都没人敢用MySQL作为数据库,因为用户体验太差,估计都要砸键盘了。 既然事务可以并发操作,这里就有一些问题:一个事务在写数据的时候,另一个事务要读这行数据,该怎么处理?一个事务在写数据,另一个数据也要写这行数据,又该怎么处理这个冲突? 这就是并发事务所产生的一些问题。具体来说就是:脏读、不可重复读和幻读。 一、概念说明 以下几个概念是事务隔离级别要实际解决的问题,所以需要搞清楚都是什么意思。 1、脏

weixin_41814871的博客 4万+

从7V到28V宽压输入,手把手教你设计一个5V/3A的DCDC电源模块(附MPS1584选型与原理图避坑)

本文详细解析了基于MPS1584芯片的7V至28V宽压输入到5V/3A输出的DCDC电源模块设计全流程。从电源架构选择、原理图设计要点到实际调试经验,涵盖了输入保护电路、功率转换核心电路及系统级优化测试,帮助工程师规避常见设计陷阱,实现高效稳定的电源解决方案。

weixin_33712987的博客 499

Mysql加锁过程详解(3)-关于mysql 幻读理解

Mysql加锁过程详解(2)-关于mysql 幻读理解出现了幻读,那么不是说mysql的重复读解决了幻读的么? 那么,InnoDB指出的可以避免幻读是怎么回事呢? http://dev.mysql.com/doc/refman/5.0/en/innodb-record-level-locks.html By default, InnoDB operates in REPEATABLE RE...

JineD的博客 5959

从二体运动到高精度轨道:STK与MATLAB联动的轨道外推算法演进史

本文探讨了轨道外推算法从二体运动到高精度轨道预报(HPOP)的演进历程,重点分析了STK与MATLAB协同仿真环境下的技术实现与应用。通过对比不同算法的精度与适用场景,展示了HPOP在卫星参数优化和轨道设计中的优势,为航天任务规划提供了高效解决方案。

weixin_29082143的博客 700

医图论文 Arxiv‘24 | 自我先验引导的 Mamba-UNet 网络在医学图像超分辨率中的应用

作者提出了一种自我先验引导的 Mamba-UNet 网络(简称 SMamba-UNet)用于医学图像超分辨率。现有方法主要基于卷积神经网络(CNNs)或 Transformer。基于 CNN 的方法无法捕捉长距离依赖关系,而基于 Transformer 的方法由于其二阶计算复杂度,面临沉重的计算挑战。最近,状态空间模型(SSMs)尤其是 Mamba 出现了,它能够以线性计算复杂度建模长距离依赖。

小白学视觉 262

什么是幻读?以及如何解决幻读问题?

关注公众号ITwords,了解更多的java,大数据的相关知识,大家一起学习,一起进步。 为了便于说明问题,这一篇文章,我们就先使用一个小一点儿的表。 CREATE TABLE `t` ( `id` int(11) NOT NULL, ...

new_buff_007的博客 5万+

YOLOv8自动驾驶系统 —— 夜间低光照条件 详细说明和完整代码

本文提出一种针对夜间低光照优化的自动驾驶车道保持系统方案,基于YOLOv8模型改进,包含三大核心技术:1.采用Retinex理论的多尺度低光增强算法,结合自适应伽马校正;2.改进YOLOv8的车道检测模型,通过夜间专用数据集训练,增加抗眩光处理;3.多传感器融合框架,整合可见光与红外图像。系统实现动态逆透视变换和参数调整,在Jetson Orin硬件上达到30ms级实时性能。测试显示在无照明、眩光干扰等极端场景下保持稳定,代码已开源。扩展方向包括V2X协同定位和自适应大灯联动控制。

u010117029的博客 598

Mysql是如何解决并发问题的?(脏读、幻读、不可重复读)

什么是脏读?脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交(commit)到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。什么是不可重复读?

weixin_50971083的博客 3310

《Autosar_BSW高阶配置》总目录_培训教程持续更新中...

目录 一、Autosar COM Module 二、Autosar BswM Module 三、Autosar EcuM Module 四、Autosar DCM Module 五、Autosar DEM Module 六、其它Module陆续推出 欢迎大家订阅《Autosar_BSW高阶配置》专栏(可以理解为是Autosar培训教程),该专栏每周至少更新一篇,一次订阅,不再二次收费,献上常用的案例和配置方法。下方整理了相关博文的链接(单击蓝色字体即可跳转),方便大家获取。 本专栏...

「汽车电子助手」的博客 4万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

MySQL的幻读是怎么被解决的?

大家好,我是小林。 我之前写过一篇数据库事务的文章「 事务、事务隔离级别和MVCC」,这篇我说过什么是幻读。 然后前几天有位读者跟我说,我这个幻读例子不是已经被「可重复读」隔离级别解决了吗?为什么还要有 next-key 呢? 他有这个质疑,是因为他做了这个实验。 实验的数据库表 t_stu 如下,其中 id 为主键。 然后在可重复读隔离级别下,有两个事务的执行顺序如下: 从这个实验结果可以看到,即使事务 B 中途插入了一条记录,事务 A 前后两次查询的结果集都是一样的,并没有出现所谓的幻读现象。 读

小林coding 4868

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Mysql的加锁情况详解

至此,mysql加锁的分析就结束了,其实挺绕的,实际总是与自己想的不一致,但是要秉持一个原则,就是mysql的锁除了保证并发事务的情况下对数据的安全读写外,还会用来解决幻读问题;有时候从幻读的角度出发,那么也就理解了为什么会这样加锁了。

qq_31753559的博客 3066

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: Mysql加锁过程详解(1)-基本知识
下一篇: Mysql加锁过程详解(3)-关于mysql 幻读理解
轻鸿飘羽
博客等级 码龄16年 124粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值