事务的四大隔离级别中的幻读问题

数据库事务隔离级别 与 脏读、不可重复读、幻读 事务的四大特征 原子性   原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。 一致性   一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。 隔离性   隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 持久性   持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提 阅读详情

1. 什么是幻读?

大部分学习过数据库的人应该都了解幻读这个概念,我在这里帮大家复习下。以下都是以InnoDB存储引擎为例进行说明。数据库并发访问中,针对delete和insert操作可能出现幻读这种现象。假设数据库的隔离级别是RC( READ COMMITTED),而且其中存在下图所示的数据,表名为account:

如果session 1 中操作:

1.start transaction;  

2.select count(id) from account;

3.commit;

session2中操作:

1.start transaction; 

2.insert into accout values(6,'徐六',1200);

3.commit;

如果现在先后执行上述两个session中的1,随后执行session 2中的2和3,最后执行session 1中的2,最后的结果是6,这个结果是符合逻辑的,即在插入一行数据之后,读取所有的数据行数是5+1,但是大家不妨仔细想一想,在session 1是在session 2之前开启事务的,所以session 1中应该读取的结果是5而不是6,这是因为session 2改变了session 1本来的结果集,从而导致了session 1的结果增加一条行记录,我们称上述现象为“幻读”。

幻读:事务A读取其符合条件的若干行,但是其他事务B改变了事务A的结果集,导致在事务A的结果集的个数增加或者减少,这种现象就叫做幻读。

2.幻读的解决方案

将数据库的隔离级别变成SERIALIZABLE就可以避免幻读现象的发生,REPEATABLE READ在某些情况下也可以避免幻读。其中SERIALIZABLE是数据隔离级别中最高的隔离级别,顾名思义,串行化,即数据库已经不存在并发执行,事务间是以串行方式执行,这种隔离级别的安全级别极高,但是并发性低,数据库的效率较低,适用于安全级别要求较高,性能要求较低的场合,而REPEATABLE是Mysql InnoDB存储引擎的默认隔离级别,可以在特殊情况下避免幻读。上述论述留下了一个问题,这就是在InnoDB存储引擎的REPEATABLE READ(RR)级别下如何避免幻读,原理是什么?

(1)在RR级别下避免幻读的发生,如果是在A事务中使用快照读先读取数据,无论事务B是否提交,在事务A中再一次快照读,读取的都是上一次快照读的数据;(这个是由快照生成的时间决定,具有不稳定性);

(2)如果是使用当前读读取事务,则内部原理就是使用next-key锁机制。next-key锁有两种,其一是行锁,其二是gap锁。如果是走的是唯一键索引,则如果是where条件全部命中,则仅需要使用行锁(为什么?原因是如果全部命中而且还是唯一索引则另一个事务无法对该事务中where后面的范围中的数据再一次进行操作,因为是唯一的),反之,需要行锁+gap合力作用,锁住可能出现幻读的数据范围。如果走的是非唯一索引或者是不加索引,则需要是行锁+gap锁两种锁。

  • 下面详细分析下如果是非唯一索引的情况下加gap锁的细节:

                                               

以上述例子为说明,如果事务A要删除id = 9的行,这个时候会在id = 9的行上加上Gap锁,其中在区间(6,9]和(9,11]的区间上加上Gap锁,这个区间在事务A提交之前是无法操作的。如果事务B对上述区间操作中的增加id=9的数据,是会出现幻读的。

由于B+树的叶子节点的数据是按照顺序进行存放的,所以对于边界条件上的情况分辨如下:

可能出现幻读的区域为:{id,name}:({6,c}--{9,b}] ({9,b}--{9,d}] ({9,d}--{11,f}]

故而:{6,b}不会加锁,{6,dd}加锁,无法插入 {6,c}<{6,xx}都是会被加上Gap锁

同理:{11,g}不会被加锁,{11,f}会被加上锁,{11,yy}<={11,f}都是会被加上Gap锁

  • 如果不加索引的情况下加gap锁的细节:

                                              

当前读操作如果不使用索引,则所有的区间都会被Gap锁锁住,类似于锁表,这种情况需要避免,因为这样数据库的效率很低。

综上所述,在RR级别下使用当前读操作可以避免出现幻读,快照读操作是可能无法彻底避免幻读的产生,这个和快照生成的时机有着关系。

 

个人公众号:王者研究中心,更多计算机知识可关注微信公众号了解,还有个人原创学习心得免费分享。

 

 

 

 

项目计划书、规划文档模板 项目计划书、规划文档模板 最近通过项目实践经历,整理出的一套项目计划书(仅供自己参考梳理思路使用) 有喜欢的文末加VX 辛苦码字如有转载请标明出处谢谢!——木研 更新的简版项目规划文档! 原版文件请+vx :baierfa ... 阅读详情

相关推荐

LT9211 单路mipi转双路mipi芯片,方案成熟,提供技术支持

LT9211 单路mipi转双路mipi芯片

TEL15012949045的博客 5014

数据库难点:脏读、幻读、不可重复读与四种隔离级别

前言 本章着重点是介绍:出现脏读、幻读、不可重复读的原因,以及设定四种隔离级别如何解决这些现象,结合图例让读者阅读得更加通透 一、什么是事务? 所谓事务是用户定义的一个数据库序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 在SQL中,定义事务的语句一般有三条: BEGIN TRANSACTION; COMMIT; ROLLBACK; 事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。 COMMIT:表示提交,即提交事务的所有操作 ROLLBACK:

weixin_51201930的博客 1万+

TikTok网页版X-bougs和_signature参数逆向实战:从断点到RPC调用的完整流程

本文详细解析了TikTok网页版X-bougs和_signature参数的逆向工程实战,从基础断点调试到高级RPC调用,完整还原加密参数的生成过程。通过工具链搭建、加密定位、核心突破及实战演练,帮助开发者深入理解TikTok的加密体系,并构建自动化签名系统。

weixin_28691003的博客 438

Mysql事务ACID和隔离级别

解决方法:通过事务隔离级别去解决,以下四个隔离级别需要对应的数据库引擎自己支持,而不是spring本身去支持,spring只是整合使用而言。虚读/幻读:当前事务中,同一条sql,多次查询,前后结果记录数不一致,有可能多了,也有可能少了。脏读和不可重复读的区别:脏读读到的是未提交的数据,而不可重复读读到的是已经提交的数据。不可重复读和虚读/幻读的区别:不可重复读侧重于修改,虚读/幻读侧重的是新增/删除。脏读:当前事务可以读到另一个事务未提交的数据。原因:并发事务导致的脏读,不可重复读,幻读。

农夫三拳 575

VCL for PHP,Konopka Signature VCL Controls (Raize Components 6.2.3) for Delphi 10.4

The Raize Components suite includes a variety of interface design tools for Delphi programming language and C ++ Builder, which includes over 125 VCL controls and over 100 different tools for creating...

weixin_42137539的博客 852

鼎捷T100二次开发实战:如何给开窗功能加上权限锁(附完整代码)

本文详细解析了鼎捷T100二次开发中开窗功能权限锁的实现方法,提供了两种技术方案:开窗程序重构法和动态WHERE条件注入法,并附上完整代码示例。通过真实案例,帮助开发者解决数据权限细粒度控制的难题,提升ERP系统的安全性和实用性。

weixin_28454475的博客 442

MySQL事务隔离级别、脏读、幻读、不可重复读现象及解决办法、快照读和当前读

tx1设置提交读,这时候就没有脏读现象。tx1开启事务做了两次查询,两次查询中间tx2执行了一次更新的事务,但是对于tx1来讲,一次事务里两次查询结果不一致,到底以哪一次为准,或者说将结果用于运算,是用哪一次,这就造成了混乱,这就是不可重复读现象。修改数据是指基于旧的数据去修改,才会重新建立快照,tx2执行修改操作,是在原有旧值得基础上增加1000,所以此时会重新建立快照,tx1的增加也是原有的增加,又重新建立的快照。tx1设置为串行读,在tx1执行读操作,会加一个共享读锁,其他事务可以读,但不能增删改。

weixin_43162044的博客 2874

基于CubeMX与lwip的STM32轻量级HTTP服务器搭建及VSCode高效开发指南

本文详细介绍了如何在STM32单片机上,利用STM32CubeMX图形化配置工具和轻量级TCP/IP协议栈lwIP,快速搭建一个轻量级HTTP服务器。通过结合VSCode的高效代码编辑能力,提供了一套从硬件连接到动态网页交互(SSI/CGI)的完整开发指南,旨在为嵌入式设备提供零成本、跨平台的Web交互界面。

weixin_29163857的博客 582

幻读及其解决方法

幻读是指在同一个事务中,前后两次查询相同范围的时候,由于其他事务的插入或删除操作,导致结果集出现新增或减少的“幻影行”。第一个事务里面,我们执行了一个范围查询。这个时候满足条件的数据只有一条。而在第二个事务里面,它插入了一行数据并且进行了提交。接着第一个事务再去查询的时候,得到的结果比第一次查询的结果多出来了一条数据。注意第一个事务的第一次查询和第二次查询都在同一个事务里面。事务 A 第一次查询 id > 100 返回 5 条记录;事务 B 插入一条 id = 150 的记录并提交;

qq_46130027的博客 2467

把审批体验做成一体化:SAP Business Workflow 里的 Secondary Method、Before Method 与 After Method

摘要:SAP Business Workflow 中,Task 的 Secondary、Before 和 After 三类方法对提升审批体验和可追溯性至关重要。Secondary Method 可自动展示辅助信息(如审批时弹出排班报表),但需注意其独立会话特性;Before Method 适合预处理和审计留痕;After Method 确保收尾动作可靠执行。三类方法按特定顺序调用,且错误不影响主流程。合理使用这些方法能减少事务码切换,增强审计能力,优化用户体验。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 187

Windows11 - Ubuntu 双系统及 ROS、ROS2 安装

在本教程中,我们将使用 Ubuntu 20.04 版本,该版本使用了新的 Ubuntu 桌面安装程序,该程序将包含在今后发布的所有 Ubuntu 版本中。如果你选择了这个选项,你会看到一个简单的界面,允许你选择要安装Ubuntu的硬盘,并通过滑块来决定你希望Ubuntu使用的磁盘空间大小。如果你的电脑有多个硬盘驱动器,那么只要它们各自有自己的驱动器,这个选项就能让你在安装 Ubuntu 的同时安装现有的操作系统。在此屏幕上,系统会提示您输入您的姓名和您的计算机名称,以显示在网络上。

机器人控制与仿真应用 4507

事务隔离级别中脏读、不可重复读,幻读问题的解决

脏读、不可重复度、幻读问题演示和解决

weixin_46628089的博客 406

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

MySQL事务隔离原理(四种隔离级别的具体实现)

一、事务的定义 以下所说的事务都是指在InnoDB引擎下,因为MyISAM引擎是不支持事务的(这也是 MyISAM 被 InnoDB 取代的重要原因之一)。 事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单元。 事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由数据库管理系统默认规定自动划分事务。在SQL中,定义事务的语句一般有三条: BEGIN TRANSACTION; COMMIT; ROLLBACK; 事务通常以BEGIN TRANSACTI

kking_edc的博客 1万+

计算机控制技术及应用

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java初学笔记37-【数据库】【mysql事务,mysql事务4种隔离级别(读未提交、读已提交、可重复读、可串行化),隔离级别的查看以及设置,不隔离出现的脏读,不可重复读,幻读】

Java初学笔记37二十二、mysql事务1. 什么是事务2. 事务和锁3. 回退事务4. 提交事务5. 事务细节二十三、mysql 事务隔离级别1. 介绍2. 不考虑事务隔离会出现的问题(1)脏读 (dirty read)(2)不可重复读 (nonrepeatable read)(3)幻读 (phantom read)3. 事务隔离级别4. mysql 的事务隔离级 -- 案例1. 默认情况下,为可重复读 (Repeatable read)2. 修改为读未提交(Read uncommitted)5. 设置

爱吃凉拌辣芒果的博客 1135

数据库事务的四大特性和四个隔离级别

数据库事务的四大特性和隔离级别

tiantian929的博客 6993

事务中的脏写、脏读、不可重复读、幻读

事务中的脏写、脏读、不可重复读、幻读 首先来说一下事务中会发生的问题:脏写、脏读、不可重复读、幻读 假设id=5的记录最原始的username=“小王” 1.脏写 sessionA sessionB begin //开启事务 begin//开启事务 update user set username=“张三” where id=5; commit//提交事务 update user set username=“李四” where id=5; ROllBACK

zcjluse的博客 1672

数据库的四大特性、隔离级别、传播级别

事务的四大特性 事务具有4个基本特征,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Duration),简称ACID ① 原子性 事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败 任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成 ② 一致性(Consistency) 事务的一致性是.

星空的日常博客,希望日常能给你帮助 1781

事务的四大特性与隔离级别、Spring的事务的传播行为

事务的四大特性 事务的四大特性简称ACID原则,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 1、原子性(Atomicity) 原子性是指事务包含的操作要么全部成功,要么全部回滚。 2、一致性(Consistency) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行...

horse_well的博客 1118

基于MySQL 8.0 对事务的深度理解

基于MySQL 8.0 对事务的深度理解 一、MySQL中事务隔离级别 事务的隔离级别有哪些? 隔离级别 脏读 不可重复读 幻读(虚读) 未提交读(Read uncommitted) 可能 可能 可能 已提交读(Read committed) 不可能 可能 可能 可重复读(Repeatable read) 不可能 不可能 可能 可串行化(Serializable )...

瘦子没有夏天 2796

什么是事务?事务的四大特性、事务的隔离级别

Spring中的事务管理 一、事务介绍   事务管理是企业级应用程序开发中必不可少的技术, 用来确保数据的完整性和一致性。   事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用。 二、事务的四个关键属性(ACID) 原子性(atomicity):事务是一个原子操作, 由一系列动作组成,事务的原子性确保动作要么全部完成要么完全不起作用。 一致性(c...

zmt0104的博客 473

mysql 虚读幻读区别_MySQL脏读、虚读、幻读

事务的特性:原子性:指处于同一个事务中的多条语句是不可分割的。一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如转账,转账前两个账户余额之和为2k,转账之后也应该是2K。隔离性:指多线程环境下,一个线程中的事务不能被其他线程中的事务打扰持久性:事务一旦提交,就应该被永久保存起来。事务隔离性问题:如果不考虑事务的隔离性,会出现以下问题:脏读:指一个线程中的事务读取到了另外一个线程...

weixin_34900758的博客 1914

spring的事务隔离级别

事务特征 ⑴ 原子性(Atomicity)   原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 ⑵ 一致性(Consistency)   一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状...

晓宇博客 3万+

【MySQL】深入解析事务与MVCC

指的是:事务执行前后,数据库中的数据是一致的。此时可以看到,由于记录的事务id为1,不论是事务A还是事务B的事务id都是 > 记录的trx_id,所以事务A和事务B都能够读取到这行数据。,该机制是InnoDB存储引擎特有的,它解决了并发事务场景下的读写性能问题,完全不需要加锁。,所以对于事务B来说就可以看见事务A修改并提交的数据,由于每次查询操作都会创建最新的。此时事务B再次读取记录信息时,就会发现这条记录的事务id为2,在事务B的。指的是:数据库中多个事务操作之间不会互相干扰,并发执行的事务之间是。

保持学习 1348

MySQL中的四大隔离级别

事务:指作为单个逻辑单元执行的一系列数据库操作。(要么全都做,要么全都不做)2、事务还具有四大特性(ACID)​​原子性事务的所有操作要么​​全部提交成功​​,要么​​全部失败回滚​​银行转账:扣款+存款必须同时成功或同时撤销​​一致性事务执行后,数据库必须​​保持合法的数据状态​​转账后账户总额保持不变(A-1000 + B+1000 = 总量不变)​​隔离性并发事务互不干扰,​​中间状态对其他事务不可见​​用户A转账时,用户B查余额看到的是转账前的状态​​持久性。

xiaonandaima的博客 718

深入了解MySQL的隔离级别和锁机制

欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片

一个菜鸟的博客 992
下一篇: 非阻塞I/O多路复用模型
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值