MySQL InnoDB引擎 脏读、不可重复读和幻读
在 MySQL 的 InnoDB 存储引擎中,脏读、不可重复读和幻读是并发事务操作时可能出现的数据不一致问题,不同的事务隔离级别对这些问题有不同的处理方式。
1、脏读(Dirty Read)
定义:一个尚未提交的数据变更的事务,被一个查询事务读取到了。如果数据变更的事务最终回滚了,那么读取到的数据就是无效的、“脏” 的数据。
产生原因:在 “读未提交(Read Uncommitted)” 隔离级别下,事务可以读取其他事务未提交的数据。
示例:
-- 会话 1
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
-- 此时会话 2 进行读取操作-- 会话 2
START TRANSACTION;
SELECT balance FROM account WHERE id = 1; -- 可能读到会话 1 未提交的修改,即 balance 减少了 100
-- 会话 1 回滚事务
ROLLBACK;
在上述示例中,会话 2 读取到了会话 1 未提交的修改,若会话 1 最终回滚,会话 2 读取的数据就是无效的。
2、不可重复读(Non-Repeatable Read)
定义:在一个事务内,多次读取同一数据时,由于其他事务对该数据进行了修改并提交,导致每次读取的结果不一致。
产生原因:在 “读已提交(Read Committed)” 隔离级别下,一个事务只能读取其他事务已经提交的数据,但在本事务执行过程中,其他事务可能会修改数据并提交,从而导致不可重复读。
示例:
-- 会话 1
START TRANSACTION;
SELECT balance FROM account WHERE id = 1; -- 第一次读取,假设余额为 1000
-- 此时会话 2 进行修改操作-- 会话 2
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
COMMIT;-- 会话 1
SELECT balance FROM account WHERE id = 1; -- 第二次读取,余额变为 900,与第一次结果不同
在这个例子中,会话 1 在事务执行过程中,由于会话 2 修改并提交了数据,导致会话 1 两次读取同一数据的结果不一致。
3、幻读(Phantom Read)
定义:在一个事务内,当执行范围查询(如 SELECT * FROM table WHERE condition
)时,由于其他事务插入或删除了符合查询条件的新数据,导致多次查询的结果集不一致。就好像出现了 “幻影” 数据一样。
产生原因:“读已提交” 和 “可重复读(Repeatable Read)” 隔离级别在处理范围查询时,可能无法阻止其他事务插入或删除符合条件的数据。虽然 “可重复读” 通过 MVCC 避免了大部分幻读,但在某些复杂场景下仍可能出现。
示例:
-- 会话 1
START TRANSACTION;
SELECT COUNT(*) FROM orders WHERE order_date = '2024-01-01'; -- 第一次查询,假设结果为 10 条记录
-- 此时会话 2 进行插入操作-- 会话 2
START TRANSACTION;
INSERT INTO orders (order_date) VALUES ('2024-01-01');
COMMIT;-- 会话 1
SELECT COUNT(*) FROM orders WHERE order_date = '2024-01-01'; -- 第二次查询,结果可能变为 11 条记录,与第一次不同
在这个例子中,会话 1 在事务执行过程中,由于会话 2 插入了符合查询条件的数据,导致会话 1 两次范围查询的结果集不一致。
4、解决方法
不同的事务隔离级别对这些问题有不同的解决能力:
读未提交:无法解决任何问题,会出现脏读、不可重复读和幻读。
读已提交:避免了脏读,但仍可能出现不可重复读和幻读。
可重复读:避免了脏读和不可重复读,在大多数情况下能避免幻读,但某些复杂场景下仍可能出现。
串行化:完全避免了脏读、不可重复读和幻读,因为事务是串行执行的,但并发性能最低。
5、不可重复读与幻读有什么区别
幻读问题和不可重复读问题都属于数据库并发事务处理中出现的数据不一致问题,但它们在定义、关注数据范围、产生场景和解决方式等方面存在明显区别,具体如下:
5.1 定义侧重点不同
不可重复读:主要强调的是在一个事务内,对同一行数据的多次读取结果不一致,是针对某一行数据而言,侧重于数据内容的变化。
幻读:是指在一个事务内,多次执行相同的范围查询时,查询结果的记录数量发生了变化,好像出现了 “幻影” 记录,重点在于结果集的记录数量和范围的变化。
5.2 关注数据范围不同
不可重复读:关注的是事务中对某一条或某几条特定记录的读取操作,重点在于特定记录的值的改变。
幻读:关注的是整个结果集的变化,涉及到数据集合的增减,通常与范围查询有关,是由于其他事务插入或删除了符合查询条件的记录,导致查询结果的记录数发生变化。
5.3 产生场景不同
不可重复读:通常发生在一个事务内对同一记录进行多次读取,而在两次读取之间,另一个事务对该记录进行了更新操作并提交。
幻读:一般出现在使用范围查询(如 SELECT * FROM table WHERE condition
)的场景中,当一个事务在进行范围查询后,另一个事务在该范围内插入或删除了记录,导致再次执行相同范围查询时结果不同。
5.4 解决方式
不可重复读:通过 “可重复读” 隔离级别基本可以解决,它使用 MVCC(多版本并发控制)和锁机制来确保在一个事务内多次读取同一数据时,读到的是事务开始时的版本,不受其他事务更新的影响。
幻读:在 MySQL 的 InnoDB 存储引擎中,“可重复读” 隔离级别通过 MVCC 和间隙锁等机制来解决大部分幻读问题,但在一些特殊场景下可能还需要更高的隔离级别 “串行化” 来完全避免。
相关文章:
MySQL InnoDB引擎 脏读、不可重复读和幻读
在 MySQL 的 InnoDB 存储引擎中,脏读、不可重复读和幻读是并发事务操作时可能出现的数据不一致问题,不同的事务隔离级别对这些问题有不同的处理方式。 1、脏读(Dirty Read) 定义:一个尚未提交的数据变更的事务&#…...
初阶数据结构:树---堆
目录 一、树的概念 二、树的构成 (一)、树的基本组成成分 (二)、树的实现方法 三、树的特殊结构------二叉树 (一)、二叉树的概念 (二)、二叉树的性质 (三&#…...
判断192.168.1.0/24网络中,当前在线的ip有哪些
需求:判断192.168.1.0/24网络中,当前在线的ip有哪些,并编写脚本打印出来。 [rootopenEuler ~]# cat 1.sh #!/bin/bash for ip in $(seq 1 254); do ping -c 1 -W 1 "192.168.1.$ip" > /dev/null 2>&1 if [ $? …...
初始JavaEE篇 —— Spring Web MVC入门(上)
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 RequestMappingg 注解介绍 Postman的介绍与使用 PostMapping 与 GetMapping 注解 构造并接收请求 接收简单参数 接收对象…...
STM32的HAL库开发-通用定时器输入捕获实验
一、通用定时器输入捕获部分框图介绍 1、捕获/比较通道的输入部分(通道1) 首先设置 TIM_CCMR1的CC1S[1:0]位,设置成01,那么IC1来自于TI1,也就是说连接到TI1FP1上边。设置成10,那个IC1来自于TI2,连接到TI2FP1上。设置成…...
nodejs:express + js-mdict 网页查询英汉词典,能播放.spx 声音
向 DeepSeek R1 提问: 我想写一个Web 前端网页,后台用 nodejs js-mdict , 实现在线查询英语单词,并能播放.spx 声音文件 1. 项目结构 首先,创建一个项目目录,结构如下: mydict-app/ ├── public/ │ …...
【蓝桥杯嵌入式】5_PWM
全部代码网盘自取 链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码:3ii2 1、PWM占空比可调 以往届的赛题举例 将PA6、PA7分别设置为TIM16_CH1和TIM17_CH1 打开TIM16和TIM17,并设置PWM输出模式及其频率 设置占空比初…...
ESM-IF1:从AF2的预测结构中学习逆折叠
作者研究了从蛋白质骨干原子坐标预测蛋白质序列的问题。迄今为止,机器学习解决此问题的方法一直受限于可用的实验测定蛋白质结构的数量。作者使用AlphaFold2为1200万个蛋白质序列预测的结构,从而将训练数据扩充了近三个数量级。相比现有方法,…...
kafka服务端之控制器
文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker,其中有一个broker会被选举为控制器(Kafka Controler),它负责管理整个集群中所有分区和副本的状态。…...
Redis双写一致性(数据库与redis数据一致性)
一 什么是双写一致性? 当修改了数据库(MySQL)中的数据,也要同时更新缓存(redis)中的数据,缓存中的数据要和数据库中的数据保持一致 双写一致性,根据业务对时间上的要求,…...
feign Api接口中注解问题:not annotated with HTTP method type (ex. GET, POST)
Bug Description 在调用Feign api时,出现如下异常: java.lang.IllegalStateException: Method PayFeignSentinelApi#getPayByOrderNo(String) not annotated with HTTPReproduciton Steps 1.启动nacos-pay-provider服务,并启动nacos-pay-c…...
开源2+1链动模式AI智能名片S2B2C商城小程序:突破流量与创意困境的新路径
摘要:本文深入剖析当前互联网行业中流量集中于巨头以及创意边际效应递减的困境,并探讨开源21链动模式AI智能名片S2B2C商城小程序在应对这些困境时所展现的独特优势与应用策略。通过对行业现状的分析以及该小程序功能特点的研究,旨在为企业在艰…...
python编程-内置函数compile(),exec(),complex(),eval()详解
1. compile() 函数 用途:将一个字符串源代码编译为字节码对象,这样可以直接被Python解释器执行,或者通过exec()或eval()函数来执行。 参数: source:一个字符串或AST(抽象语法树)对象&am…...
websocket自动重连封装
websocket自动重连封装 前端代码封装 import { ref, onUnmounted } from vue;interface WebSocketOptions {url: string;protocols?: string | string[];reconnectTimeout?: number; }class WebSocketService {private ws: WebSocket | null null;private callbacks: { [k…...
解锁C/C++:链表数据结构的奇幻之旅
目录 一、引言二、链表基础概念2.1 链表是什么2.2 链表的类型三、C 语言实现链表3.1 定义链表节点3.2 创建链表3.3 链表操作3.3.1 遍历链表3.3.2 插入节点3.3.3 删除节点3.3.4 查找节点3.4 完整示例代码四、C++ 实现链表4.1 定义链表节点类4.2 创建链表4.3 链表操作4.3.1 遍历链…...
x64、aarch64、arm与RISC-V64:详解四种处理器架构
x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…...
nuxt3中报错: `setInterval` should not be used on the server.
那是因为在后端渲染没有浏览器的执行环境,一些浏览器环境提供的对象和方法都无法使用,代码判断下就行。 if (import.meta.client) {setInterval(() > {}, 1000) }Import meta Nuxt API...
python编程-集合内置函数和filter(),集合常见操作
在Python中,列表、集合、字典是三种常用的数据结构,它们各自拥有一些内置函数,用于执行各种操作。 一、列表的常用内置函数 #1、append(obj): 在列表末尾添加新的对象。list_a [1, 2, 3] list_a.append(4) print(list_a) # 输出: [1,…...
三极管的截止、放大、饱和区
三极管的几个区,都有什么用: 截止区:晶体管不导通,用于开关电路的“关”状态。 放大区:晶体管用于信号放大,集电极电流与基极电流成正比。 饱和区:晶体管完全导通,用于开关电路的“…...
python爬虫--简单登录
1,使用flask框架搭建一个简易网站 后端代码app.py from flask import Flask, render_template, request, redirect, url_for, sessionapp Flask(__name__) app.secret_key 123456789 # 用于加密会话数据# 模拟用户数据库 users {user1: {password: password1}…...
苹果公司宣布正式开源 Xcode 引擎 Swift Build145
2025 年 2 月 1 日,苹果公司宣布正式开源 Xcode 引擎 Swift Build145。 Swift 是苹果公司于 2014 年推出的一种开源编程语言,用于开发 iOS、iPadOS、macOS、watchOS 和 tvOS 等平台的应用程序。 发展历程 诞生:2014 年,苹果在全球…...
齿轮减速机和平行轴减速机有何区别?
减速机是传动系统中重要的组成部分,常用的减速机有四大系列,分别是平行轴减速机、同轴减速机、直角减速机和齿轮减速机。那么大家知道齿轮减速机和平行轴减速机投什么区别吗? 齿轮减速机的轴不一定是平行的,还可能存在相交轴或交错…...
基于Hexo实现一个静态的博客网站
原文首发:https://blog.liuzijian.com/post/8iu7g5e3r6y.html 目录 引言1.初始化Hexo2.整合主题Fluid3.部署评论系统Waline4.采用Nginx部署 引言 Hexo是中国台湾开发者Charlie在2012年创建的一个开源项目,旨在提供一个简单、快速且易于扩展的静态博客生…...
MIT6.824 Lecture 1-Introduction
balance:性能和容错 Faulty tolerance: Availablity、Recoverability、NV storage(非易失性存储,比较贵)、Replication(多个数据副本) consistency: Put(key,…...
【Redis实战】投票功能
1. 前言 现在就来实践一下如何使用 Redis 来解决实际问题,市面上很多网站都提供了投票功能,比如 Stack OverFlow 以及 Reddit 网站都提供了根据文章的发布时间以及投票数计算出一个评分,然后根据这个评分进行文章的展示顺序。本文就简单演示…...
1Panel应用推荐:WordPress开源博客软件和内容管理系统
1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…...
GGML、GGUF、GPTQ 都是啥?
GGML、GGUF和GPTQ是三种与大型语言模型(LLM)量化和优化相关的技术和格式。它们各自有不同的特点和应用场景,下面将详细解释: 1. GGML(GPT-Generated Model Language) 定义:GGML是一种专为机器学习设计的张量库,由Georgi Gerganov创建。它最初的目标是通过单一文件格式…...
MySQL主从复制原理及工作过程
一、主从复制原理 1、MySQL将数据变化记录到二进制日志中; 2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中; 3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数据库 详细步骤&…...
Unity VideoPlayer播放视屏不清晰的一种情况
VideoPlayer的Rnder Texture可以设置Size,如果你的视屏是1920*1080那么就设置成1920*1080。 如果设置成其他分辨率比如800*600会导致视屏不清晰。...
发布:大彩科技DN系列2.8寸高性价比串口屏发布!
一、产品介绍 该产品是一款2.8寸的工业组态串口屏,采用2.8寸液晶屏,分辨率为240*320,支持电阻触摸、电容触摸、无触摸。可播放动画,带蜂鸣器,默认为RS232通讯电平,用户短接屏幕PCB上J5短接点即可切换为TTL电…...
Oh3.2项目升级到Oh5.0(鸿蒙Next)具体踩坑记录(一)
目录 1.自动修复部分 Cause: The project structure and configuration require an upgrade. Solution: 1. Use Migrate Assistant to auto-upgrade the project structure and configuration. 2. Manually upgrade the project structure and configuration by following th…...
pytest+request+yaml+allure 接口自动化测试全解析[手动写的跟AI的对比]
我手动写的:Python3:pytest+request+yaml+allure接口自动化测试_request+pytest+yaml-CSDN博客 AI写的:pytest+request+yaml+allure 接口自动化测试全解析 在当今的软件开发流程中,接口自动化测试扮演着至关重要的角色。它不仅能够提高测试效率,确保接口的稳定性和正确性…...
Redis存储⑤Redis五大数据类型之 List 和 Set。
目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…...
使用PyCharm进行Django项目开发环境搭建
如果在PyCharm中创建Django项目 1. 打开PyCharm,选择新建项目 2.左侧选择Django,并设置项目名称 3.查看项目解释器初始配置 4.新建应用程序 执行以下操作之一: 转到工具| 运行manage.py任务或按CtrlAltR 在打开的manage.pystartapp控制台…...
C# 综合运用介绍
.NET学习资料 .NET学习资料 .NET学习资料 C# 作为一种由微软开发的面向对象编程语言,在软件开发领域占据着重要地位。凭借其简洁、类型安全以及与.NET 框架的紧密结合等特性,C# 被广泛应用于多个领域。下面将详细介绍 C# 的综合运用。 一、C# 语言特性…...
Docker 和 Docker Compose
Docker 和 Docker Compose 是两个相关但用途不同的工具,它们在容器化应用的管理和部署中扮演不同的角色。以下是它们的核心区别: 1. 功能定位 Docker: 是一个容器化平台,用于创建、运行和管理单个容器。适用于单个容器应用的开发和测试。通过…...
文件上传到腾讯云存储、签名及设置过期时间
将文件上传到腾讯云对象存储(COS,Cloud Object Storage)可以通过腾讯云提供的 SDK 实现。以下是详细的步骤和示例代码,帮助您完成文件上传操作。 步骤 注册腾讯云账号并创建存储桶: (1)登录腾讯…...
从0开始达芬奇(6)
软件交互 就是与PR,AE软件进行交互。(这个就不多说啦) 快捷键(以下是TIM总结的常用快捷键)...
如何在Windows上使用Docker
引言 WSL2(Windows Subsystem for Linux2)是微软开发的一种技术,允许在 Windows 操作系统上运行 Linux 环境。它提供了一个兼容层,使得用户可以在 Windows 系统中直接运行 Linux 命令行工具、应用程序和开发工具,而无需…...
细胞计数专题 | 如何减少台盼蓝沉淀?
台盼蓝(Trypan Blue)是一种在生物学研究中广泛使用的染料,尤其常用于细胞活力检测。当细胞死亡时,其细胞膜会变得对台盼蓝具有通透性,染料因而能够进入细胞并与细胞内的蛋白质结合,产生染色效果。由此&…...
go流程控制
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。 Go 语言中最常用的流程控制有 if 和 for,而 switch 和 goto 主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制。 if else…...
Spring Web MVC项目的创建及使用
一、什么是Spring Web MVC? Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中,通常被称为Spring MVC。 1.1 MVC的定义 MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构…...
RabbitMQ 从入门到精通:从工作模式到集群部署实战(四)
#作者:闫乾苓 系列前几篇: 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》:link 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)》: lin…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数
声明 就在 main函数所在的 nginx.c 中: static ngx_int_t ngx_get_options(int argc, char *const *argv); 实现 static ngx_int_t ngx_get_options(int argc, char *const *argv) {u_char *p;ngx_int_t i;for (i 1; i < argc; i) {p (u_char *) argv[i]…...
TCP长连接、HTTP短轮询、HTTP长轮询、HTTP长连接、WebSocket的区别
1.TCP长连接 (1)概念:该连接属于传输层的协议。客户端和服务器之间建立连接后,不立即断开该连接,而是一直保持这个状态,以便后续数据的持续、连续传输。(2)应用场景:适合…...
在 Flownex 中创建自定义工作液
在这篇博文中,我们将了解如何在 Flownex 中为流网添加和定义一种新的流体温度相关工作材料。 Flownex 物料管理界面 在 Flownex 中使用与温度相关的流体材料时,了解其特性与温度的关系非常重要。这种了解可确保准确预测各种热条件下的流体行为࿰…...
基于Spring Boot的图书个性化推荐系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【抽象代数】1.1. 运算及关系
集合与映射 定义1. 设 为 的子集,定义 到 的映射 : 使得 ,称 为 到 的嵌入映射。 定义2. 设 为 的子集, 为 到 的映射, 为 到 的映射,如果 ,称为的开拓, 为 的限制&…...
拥抱开源,助力创新:IBM永久免费云服务器助力开源项目腾飞
近年来,开源项目蓬勃发展,为全球科技进步做出了巨大贡献。然而,服务器成本高昂常常成为开源项目的巨大障碍。许多优秀的项目因缺乏资源而难以持续发展,甚至夭折。令人振奋的是,IBM云计算平台推出了一项重磅活动&#x…...
Windows Docker笔记-简介摘录
Docker是一个开源的容器化平台,可以帮助开发人员将应用程序与其依赖项打包在一个独立的容器中,然后在任何安装的Docker的环境中快速、可靠地运行。 几个基本概念和优势: 1. 容器 容器是一个轻量级、独立的运行环境,包含了应用程…...