幻读是什么,用什么隔离级别可以防止幻读?
幻读指的是,在同一个事务中,以同样的条件执行的两次查询,第二次查询查到了第一次查询所没查到的数据。
在mysql的四种隔离级别中,可重复读和串行化两种隔离级别没有幻读问题。那么它们是如何解决幻读问题的呢?
先说串行化这个隔离级别,串行化是通过加锁的方式,让事务按照顺序串行执行,事务会对整张表加锁,读操作时加共享锁,写操作时加排它锁,总之,事务会对整张表加锁,并且这个锁要到事务结束时才释放,所以串行化这个隔离级别根本就不会有幻读问题。
再说可重复读,在可重复读这个隔离级别下,快照读是不会有幻读问题的【也可以说快照读用MVCC避免了幻读问题】,只有当前读会有幻读问题,那么什么是快照读和当前读呢?
快照读读的是快照数据,是由MVCC机制实现的,因为读的是快照数据,所以即便是有其他事务并发修改了数据或者添加了新的数据,也不会对当前事务的快照读造成影响,因为当前事务的快照读读的是同一个版本的快照,所以快照读不会有幻读问题。读已提交 和 可重复读这两种隔离级别下的所有的普通的select查询都是快照读,除了快照读之外就都是当前读了。
当前读读的永远都是最新版本的数据,当前读会对这些数据加锁,以避免其他的事务并发去修改这些数据,当前读包括:
1、加共享锁的select:select * from user lock in share mode;
2、加排它锁的select: select * from user for update;
3、增删改操作:insert、delete、update。虽然看起来增删改操作与读无关,但其实在增删改之前都要先执行当前读,以将符合条件的数据锁起来,避免其他事务并发去修改它们。
当前读为什么会有幻读问题呢?
虽然当前读能够将符合条件的数据加锁,以阻塞其他事务对于这些数据的修改,却不能够避免其他事务添加新的数据,而其他事务添加的新的数据,有可能对于当前事务的当前读造成影响:一旦其他事务所添加的数据是满足我们当前读的条件的,那么当我们在当前事务中再以同样的条件执行一次当前读时,就会读到其他事务添加的那条新的数据,幻读就发生了。分析一下原因,幻读问题的发生是因为,当前读所加的行锁只是锁住了数据库中已存在的满足条件的记录,却不能够避免其他事物添加新数据的操作。为了解决这个问题,InnoDb存储引擎引入了间隙锁。
间隙锁
同行锁锁住满足条件的行不同,间隙锁锁住的是行之间的间隙,当为某些间隙添加了间隙锁,其他事务就不能往这些间隙中添加新的数据了,比如:当前读的条件是 5<id<10,那么行锁锁住的是id落在5到10之间的行,而间隙锁锁住的是5到10之间的间隙,如果有其他事务想要添加新的数据,而新数据的id在5到10之间,那么这个添加请求将被阻塞。
可重复读在当前读模式下,用行锁+间隙锁来解决了幻读问题,行锁+间隙锁又叫Next-Key Lock。
相关文章:
幻读是什么,用什么隔离级别可以防止幻读?
幻读指的是,在同一个事务中,以同样的条件执行的两次查询,第二次查询查到了第一次查询所没查到的数据。 在mysql的四种隔离级别中,可重复读和串行化两种隔离级别没有幻读问题。那么它们是如何解决幻读问题的呢? 先说串行…...

UE5 C++学习笔记 FString FName FText相互转换
1.FString 是UE里的String。最接近std::string, 唯一可以修改的字符串类型。性能更低 TEXT(string) TEXT宏,作用是将字符串转换成Unicode,切记UE中使用字符串输出要使用该宏 2. FName 是UE里特有的类型。它更注重于表示名称不区分大小写,不…...
【ASOC全解析(三)】machine原理和实战
【ASOC全解析(三)】machine原理和实战 一、machine概述与原理1.1 machine的主要职责1.2 本文的主要内容 二、machine程序示例完整的machine驱动代码示例扩展知识:SND_SOC_DAILINK_DEFS使用方法说明总结与其它说明 /*************************…...

matlab appdesigner系列-常用15-滑块、微调器
滑块,以左右拖动的方式在一定范围内改变数值 此示例,滑块显示微调器的数值,微调器也可以显示滑块的数值 操作步骤为: 1)将滑块和微调器拖拽到画布上 2)分别设置这两个组件的回调函数 回调函数有两个选项…...
google翻译相机报错 请安装最新的Google应用,以便使用相机翻译功能
修复:google翻译相机报错 背景:解决方法 背景: 国内手机使用google翻译的相机时报错: 请安装最新的Google应用,以便使用相机翻译功能点击报错的“确定”后转到了国内空白的软件商店页面 解决方法 Google Play搜索 …...
openssl3.2/test/certs - 015 - Primary intermediate ca: ca-cert
文章目录 openssl3.2/test/certs - 015 - Primary intermediate ca: ca-cert概述笔记END openssl3.2/test/certs - 015 - Primary intermediate ca: ca-cert 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 这个例子有不同的地方, 发证书时, 指定了CA. 看实验注释, 是…...

linux中用户及用户组信息
1,linux通过用户名和口令来验证用户的身份。 2,几个用户可以组成一个用户组。 3,useradd工具添加用户,groupadd命令添加用户组。 4,history 命令查看用户在Shell中执行命令的历史记录。 5,userdel命令删…...

用Go plan9汇编实现斐波那契数列计算
斐波那契数列是一个满足递推关系的数列,如:1 1 2 3 5 8 ... 其前两项为1,第3项开始,每一项都是其前两项之和。 用Go实现一个简单的斐波那契计算逻辑 func fib(n int) int {if n 1 || n 2 {return 1}return fib(n-1) fib(n-2) …...

Message queue 消息队列--RabbitMQ 【基础入门】
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门…...

【汇编】 13.3 对int iret和栈的深入理解
书中示例 assume cs:codecode segment start:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset end0-offset lpcldrep movsb ;lp到end0的指令传送到0:200处mov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*42],0 ;设置7c表项…...
Git提交大文件报错“remote: Please remove the file from history and try again. ”
如在使用Git过程中不小心将较大的二进制文件加入仓库,那么仓库大小很快就会超过规定的配额,在Push的时候会报下面的错误: remote: Powered by GITEE.COM [GNK-6.4] remote: error: File: c91e5de4f55bedd0669db01036fc131ea8e516ce 130.66 MB…...

接口测试 03 -- 接口自动化思维 Requests库应用
1. 接口自动化思维梳理 1.1接口自动化的优点 接口测试自动化,简单来讲就是功能测试用例脚本化然后执行脚本,产生一份可视化测试报告。不管什么样的测试方式,都是为了验证功能与发现 BUG。那为什么要做接口测试自动化呢?一句话概括…...

SpringBoot:Bean生命周期自定义初始化和销毁
🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、Bean注解指…...

Git--基本操作介绍(2)
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull. 说明: workspace:工作区staging area:暂存区/缓存区local repository:版本库或本地仓库remote repository…...

第08章_面向对象编程(高级)(static,单例设计模式,理解mian方法,代码块,final,抽象类与抽象方法,接口,内部类,枚举类,注解,包装类)
文章目录 第08章_面向对象编程(高级)本章专题与脉络1. 关键字:static1.1 类属性、类方法的设计思想1.2 static关键字1.3 静态变量1.3.1 语法格式1.3.2 静态变量的特点1.3.3 举例1.3.4 内存解析 1.4 静态方法1.4.1 语法格式1.4.2 静态方法的特点1.4.3 举例 1.5 练习 …...
Java中Map接口常用的方法
java.util.Map接口中常用的方法: 1.Map和Collection没有继承关系 2.Map集合以key和value的方式存储数据:键值对 key和value都是引用数据类型 key和value都是存储对象的内存地址 key起到主导的地位,value是key的一个附属品 3.Map接口中常用的方…...

Linux软件包管理器yum
文章目录 前言概述Linux下载软件的三种方式源代码安装rpm安装yum安装 关于yum的相关操作查看软件包软件安装卸载软件 yum源问题 前言 在Windows系统中,如果我们要去下载软件,我们可以在该软件的官网中进行下载,或者在微软的额软件商店进行下…...

Linux中NFS服务器的搭建和安装
1.介绍: 网络文件系统即将本地系统放在网络上某一个位置的系统,基于UDP/IP使用nfs能够在不同计算机之间通过网络进行文件共享,能使使用者访问网络上其他计算机中的文件就像在访问自己的计算机一样,也就是说放在一个开发板上&#…...
c递归算法模型
使用递归算法模型可以较为自然地解决许多问题,尤其是对于那些数据结构层次比较清晰的问题,递归算法模型往往能够提供一种简单清晰的解法。 递归算法模型的核心思想是将一个大问题通过递归的方式拆分为若干个较小的问题,并不断递归下去直到问…...

力扣740. 删除并获得点数
动态规划 思路: 选择元素 x,获得其点数,删除 x 1 和 x - 1,则其他的 x 的点数也会被获得;可以将数组转换成一个有序 map,key 为 x, value 为对应所有 x 的和;则问题转换成了不能同…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...