幻读是什么,用什么隔离级别可以防止幻读?
幻读指的是,在同一个事务中,以同样的条件执行的两次查询,第二次查询查到了第一次查询所没查到的数据。
在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 的和;则问题转换成了不能同…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
