MySQL的三种并发问题和四种隔离级别

阅读之前,请心里默念,脏读、不可重复读、幻读是三种常见的并发问题,隔离级别是应对并发问题的四种隔离级别,隔离级别和并发问题是两个东西,不要混淆。

在数据库事务中,脏读(Dirty Read)不可重复读(Non-Repeatable Read)幻读(Phantom Read) 是三种常见的并发问题。它们与事务的隔离级别密切相关,理解这些问题有助于选择合适的隔离级别来平衡数据一致性和并发性能。

一、三大并发问题

1、脏读

脏读是指一个事务读取了另一个未提交事务的修改数据。如果未提交事务最终回滚,那么读取到的数据就是无效的(即”脏数据“)

示例:

假设有两个事务事务A事务B

  • 事务A更新了一行数据,将balance从100改为200,但尚未提交

  • 事务B读取了这行数据,得到balance=200

  • 事务A回滚了更新操作,balance恢复为100

  • 事务B读取到了balance=200是无效的(脏数据)

影响

  • 数据不一致:事务读取到的数据可能是无效的

  • 业务逻辑错误:基于脏数据的操作可能导致错误的业务结果

解决方式

使用读已提交或更高的隔离级别,确保事务只能读取已提交的数据

2、不可重复读

不可重复读是指在一个事务中,多次读取同一数据时,由于其他事务的修改,导致读取到的结果不一致

示例:

假设有两个事务事务A事务B

  1. 事务A读取了一行数据,得到balance=100.

  2. 事务B更新了这行数据吗,将balance从100改为200,并提交

  3. 事务A再次读取这行数据,得到balance=200

  4. 事务A在同一个事务中两次读取同一数据,结果不一致

影响:

  • 数据不一致:事务中多次读取同一数据可能得到不同结果

  • 业务逻辑错误:基于不一致数据的操作可能导致错误的业务结果

解决方式

  • 使用可重复读或更高的隔离级别,确保事务中多次读取同一数据时结果保持一致

3、幻读

幻读是指在一个事务中,多次执行相同的查询时,由于其他事务的插入或删除操作,导致返回的结果集不一致

示例:

假设有两个事务事务A事务B

  1. 事务A执行查询SELECT * FROM users WHERE age>18,返回10行数据

  2. 事务B插入了一行新数据,age=20,并提交

  3. 事务A再次执行相同的查询,返回11行数据

  4. 事务A在同一个事务中两次执行相同的查询,结果集不一致(新增了一行数据)

影响

  • 数据不一致:事务中多次执行相同的查询可能返回不同的结果集

  • 业务逻辑错误:基于不一致结果集的操作可能导致错误的业务结果

解决方式

  • 使用串行化(Serializable)隔离级别,通过枷锁机制确保事务串行化执行,避免幻读

  • 在MySQL中,可重复读(Repeatable Read)隔离级别通过Next-key Lock机制部分解决了幻读问题

4、不可重复读和幻读的区别

不可重复读是指在一个事务中,多次读取同一行数据时,由于其他事务的修改(更新或删除),导致读取到的结果不一致

幻读是指在一个事务中,多次执行相同的查询时,由于其他事务的插入或删除操作,导致返回的结果集不一致

不可重复读示例

  1. 事务A 读取 balance = 100

  2. 事务B 更新 balance = 200 并提交。

  3. 事务A 再次读取 balance,发现值变为 200。

幻读示例

  • 事务A 执行一个范围查询(如 SELECT * FROM users WHERE age > 18)。

  • 事务B 插入或删除了符合该查询条件的数据并提交。

  • 事务A 再次执行相同的查询时,发现结果集发生了变化(新增或减少了行)。

特性不可重复读(Non-Repeatable Read)幻读(Phantom Read)
操作对象同一行数据多行数据(结果集)
触发操作更新(UPDATE)或删除(DELETE)插入(INSERT)或删除(DELETE)
影响范围单行数据的值发生变化结果集的行数发生变化
示例事务A 读取 balance = 100,事务B 更新为 200。事务A 查询 age > 18,事务B 插入新数据。

两个并发问题的关注点在于(一行数据和结果集

二、四种隔离级别

1. 读未提交(Read Uncommitted)

事务可以读取其他未提交事务的修改(即“脏读”)。

特点

  • 最低的隔离级别,提供最少的并发控制。

  • 事务可以看到其他事务未提交的数据,可能导致脏读、不可重复读和幻读。

  • 性能最高,但数据一致性最差。

问题

  • 脏读(Dirty Read):事务读取到其他未提交事务的修改,如果该事务回滚,读取的数据就是无效的。

使用场景

  • 对数据一致性要求极低的场景,如统计查询等。


2. 读已提交(Read Committed)

事务只能读取其他事务已经提交的数据。

特点

  • 解决了脏读问题,但可能出现不可重复读和幻读。

  • 每次执行查询时都会生成一个新的快照(Read View),确保事务只能看到已经提交的数据。

  • 性能较高,数据一致性较好。

问题

  • 不可重复读(Non-Repeatable Read):同一事务中多次读取同一数据,结果不一致。

  • 幻读(Phantom Read):同一事务中多次执行相同的查询,结果集不一致。

使用场景

  • 对数据一致性有一定要求,但允许不可重复读的场景。


3. 可重复读(Repeatable Read)

事务在执行期间多次读取同一数据时,结果是一致的。

特点

  • 解决了脏读和不可重复读问题,但可能出现幻读。

  • 事务在第一次执行查询时生成一个快照(Read View),并在整个事务期间使用该视图。

  • MySQL 的默认隔离级别。

  • 性能中等,数据一致性较好。

问题

  • 幻读(Phantom Read):同一事务中多次执行相同的查询,结果集不一致。

使用场景

  • 对数据一致性要求较高的场景,如金融系统等。


4. 串行化(Serializable)

事务串行执行,完全隔离,确保最高的数据一致性。

特点

  • 最高的隔离级别,提供最强的并发控制。

  • 通过加锁机制(如读写锁)确保事务串行执行。

  • 解决了脏读、不可重复读和幻读问题。

  • 性能最低,数据一致性最强。

问题

  • 性能开销大:由于事务串行执行,并发性能大幅下降。

  • 锁冲突:可能导致大量锁等待和死锁。

使用场景

  • 对数据一致性要求极高的场景,如银行核心系统等。


5. 隔离级别对比

隔离级别脏读(Dirty Read)不可重复读(Non-Repeatable Read)幻读(Phantom Read)性能
读未提交可能可能可能最高
读已提交不可能可能可能较高
可重复读不可能不可能可能中等
串行化不可能不可能不可能最低

但是

一般来说,面试的话面试官会转手就问你,那mysql是怎么实现隔离的呢?或者问你对数据库的MVCC(多版本并发控制了解多少)? 请参考 MySQL隔离级别的实现方式

然后就又问你,如果用可重复读,我们基于第一次查询到100块,在事务未提交前,第二个事务将100更新为150,这个时候基于第一次的100去操作数据,结果是错的,这时该怎么办?请参考

当规避了不可重复读问题后,怎么保证幂等性

那么又有个问题,既然都从头到尾只读第一次的数据了,为什么可重复读不能决幻读问题呢?可重复读隔离级别为什么不能防止幻读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23718.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Nanopi duo2的WiFi智能摄像头

1.固件包烧录 https://wiki.friendlyelec.com/wiki/index.php/NanoPi_Duo2/zh#.E8.BF.9E.E6.8E.A5WiFi 固件包链接以及烧录工具都在上面链接中 烧录过程 使用读卡器将SD卡插入到电脑,然后打开烧录工具 2.通过串口工具连接板子使其连接WiFi 对应的串口工具,就是这个HyperT…

单片机延时函数怎么写规范?

我们以前在开发产品的时候,肯定会碰到一些延时需求,比如常见的LED闪烁,按键消抖,控制IO口输出时序等等。 别小看延时,这个小问题,想做好,甚至要考虑到程序架构层面。 在开发板上,可能…

Dify私有化部署自己的AI Agent

1、下载Dify git clone gitgithub.com:langgenius/dify.git 2、创建Dify配置 进入dify目录下的docker目录中,复制.env.example为 .env 3、使用Docker命令进行部署Dify docker compose up -d 4、访问Dify http://localhost/install 5、 设置模型供应商 配置环境变量&#xff1…

【Unity】鱼群效果模拟

鱼群效果模拟 文章目录 鱼群效果模拟Boid算法实现方式version1_CPUversion2_GPUversion3_Multilaterationversion4_Bitonic_Sorting (GPU友好)version5_Skinning (TODO) 细节项优化项参考链接 Boid算法 Boid算法是一种模拟群体行…

【AI时代】可视化训练模型工具LLaMA-Factory安装与使用

文章目录 安装训练使用 安装 官方地址:https://github.com/hiyouga/LLaMA-Factory 创建虚拟环境 conda create -n llama-factory conda activate llama-factory安装 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip in…

tailwindcss学习03

01 入门 02 vue中接入 03 工具类优先 准备 vue.svg <svg viewBox"0 0 40 40" xmlns"http://www.w3.org/2000/svg"> <defs> <linearGradient x1"50%" y1"0%" x2"50%" y2"100%" id"a"&…

Java 笔记(自用)

Java是一种面向对象(opp)的、解释性的跨平台语言。所谓的跨平台是Java的一个编译好的.class文件可以在多个系统下运行。解释性则是编译后的代码需要解释器来执行&#xff0c;与之相对应的c/c是编译性语言&#xff0c;编译后的代码可以直接被机器执行。 jdkjrejava的开发工具 …

Matlab——图像保存导出成好看的.pdf格式文件

点击图像的右上角&#xff0c;点击第一个保存按钮键。

游戏引擎学习第120天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾&#xff1a;周期计数代码 我们正在进行一个项目的代码优化工作&#xff0c;目标是提高性能。当前正在优化某个特定的代码片段&#xff0c;已经将其执行周期减少到48个周期。为了实现这一目标&#xff0c;我们设计了一个…

大语言模型微调的公开JSON数据

大语言模型微调的公开JSON数据 以下是一些可用于大语言模型微调的公开JSON数据及地址: EmoLLM数据集 介绍:EmoLLM是一系列能够支持理解用户、帮助用户心理健康辅导链路的心理健康大模型,其开源了数据集、微调方法、训练方法及脚本等。数据集按用处分为general和role-play两种…

20分钟 Bash 上手指南

文章目录 bash 概念与学习目的第一个 bash 脚本bash 语法变量的使用位置参数管道符号&#xff08;过滤条件&#xff09;重定向符号条件测试命令条件语句case 条件分支Arrayfor 循环函数exit 关键字 bash 脚本记录历史命令查询文件分发内容 bash 概念与学习目的 bash&#xff0…

《Python实战进阶》专栏 No.3:Django 项目结构解析与入门DEMO

《Python实战进阶》专栏 第3集&#xff1a;Django 项目结构解析与入门DEMO 在本集中&#xff0c;我们将深入探讨 Django 的项目结构&#xff0c;并实际配置并运行一个入门DEMO博客网站&#xff0c;帮助你在 Web 开发中更高效地使用 Django。Django 是一个功能强大的 Python Web…

Spring Boot 应用(官网文档解读)

Spring Boot 启动方式 SpringApplication.run(MyApplication.class, args); Spring Boot 故障分析器 在Spring Boot 项目启动发生错误的时候&#xff0c;我们通常可以看到上面的内容&#xff0c;即 APPLICATION FAILED TO START&#xff0c;以及后面的错误描述。这个功能是通过…

win32汇编环境,对话框中使用菜单示例三

;运行效果 ;win32汇编环境,对话框中使用菜单示例三 ;鼠标点击右键时&#xff0c;弹出菜单的功能 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>>>>>>>>>&g…

stm32-电源控制

STM32 的 PWR&#xff08;Power Control&#xff09;外设 是用于管理微控制器电源模式和外设电源控制的模块。通过 PWR 外设&#xff0c;可以实现低功耗模式、电压调节、备份域控制等功能&#xff0c;从而优化系统的功耗和性能。 stm32内部电源框图 电源区域 VDD 供电区&#x…

云计算及其他计算

云计算知识思维导图&#xff1a;https://kdocs.cn/l/cpl2Kizx7IyC 云计算的核心判断标准通常基于美国国家标准与技术研究院&#xff08;NIST&#xff09;的定义&#xff0c;并结合实际应用场景。以下是判断一个服务是否为云计算的关键标准&#xff0c;以及对应的服务类型&#…

mysql之B+ 树索引 (InnoDB 存储引擎)机制

b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言&#xff1a;****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读&#xff0c;与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…

量子计算驱动的金融衍生品定价革命:突破传统蒙特卡洛模拟的性能边界

引言&#xff1a;金融计算的算力困局 某国际投行采用128量子位处理器对亚洲期权组合定价时&#xff0c;其量子振幅估计算法在2.7秒内完成传统GPU集群需要68小时的计算任务。在蒙特卡洛路径模拟实验中&#xff0c;量子随机游走算法将10,000维衍生品的价格收敛速度提升4个数量级…

Web刷题之PolarDN(中等)

1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有&#xff1a;$$使用不当&#xff0c;extract()函数使用不当&#xff0c;parse_str()函数使用不当&…

ShenNiusModularity项目源码学习(12:ShenNius.Common项目分析)

ShenNius.Common项目中主要定义功能性的辅助函数类及通用类&#xff0c;供MVC模式、前后端分离模式下的后台服务使用&#xff0c;以提高编程效率。   ApiResult文件内的ApiResult和ApiResult类定义了通用的数据返回格式&#xff0c;包括状态码、返回消息、返回数据等&#x…