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
-
事务A读取了一行数据,得到balance=100.
-
事务B更新了这行数据吗,将balance从100改为200,并提交
-
事务A再次读取这行数据,得到balance=200
-
事务A在同一个事务中两次读取同一数据,结果不一致
影响:
-
数据不一致:事务中多次读取同一数据可能得到不同结果
-
业务逻辑错误:基于不一致数据的操作可能导致错误的业务结果
解决方式
-
使用可重复读或更高的隔离级别,确保事务中多次读取同一数据时结果保持一致
3、幻读
幻读是指在一个事务中,多次执行相同的查询时,由于其他事务的插入或删除操作,导致返回的结果集不一致
示例:
假设有两个事务事务A和事务B
-
事务A执行查询
SELECT * FROM users WHERE age>18
,返回10行数据 -
事务B插入了一行新数据,age=20,并提交
-
事务A再次执行相同的查询,返回11行数据
-
事务A在同一个事务中两次执行相同的查询,结果集不一致(新增了一行数据)
影响
-
数据不一致:事务中多次执行相同的查询可能返回不同的结果集
-
业务逻辑错误:基于不一致结果集的操作可能导致错误的业务结果
解决方式
-
使用串行化(Serializable)隔离级别,通过枷锁机制确保事务串行化执行,避免幻读
-
在MySQL中,可重复读(Repeatable Read)隔离级别通过Next-key Lock机制部分解决了幻读问题
4、不可重复读和幻读的区别
不可重复读是指在一个事务中,多次读取同一行数据时,由于其他事务的修改(更新或删除),导致读取到的结果不一致
幻读是指在一个事务中,多次执行相同的查询时,由于其他事务的插入或删除操作,导致返回的结果集不一致
不可重复读示例
-
事务A 读取
balance = 100
。 -
事务B 更新
balance = 200
并提交。 -
事务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去操作数据,结果是错的,这时该怎么办?请参考
当规避了不可重复读问题后,怎么保证幂等性
那么又有个问题,既然都从头到尾只读第一次的数据了,为什么可重复读不能决幻读问题呢?可重复读隔离级别为什么不能防止幻读
相关文章:
MySQL的三种并发问题和四种隔离级别
阅读之前,请心里默念,脏读、不可重复读、幻读是三种常见的并发问题,隔离级别是应对并发问题的四种隔离级别,隔离级别和并发问题是两个东西,不要混淆。 在数据库事务中,脏读(Dirty Readÿ…...
【复习】Redis
数据结构 Redis常见的数据结构 String:缓存对象Hash:缓存对象、购物车List:消息队列Set:点赞、共同关注ZSet:排序 Zset底层? Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…...
【Docker】如何在Linux、Windows、MacOS中安装Docker
Linux安装Docker 在终端中执行一键安装脚本命令安装dockersudo curl -fsSL https://gitee.com/tech-shrimp/docker_installer/releases/download/latest/linux.sh | bash -s docker --mirror Aliyun1.1 配置docker镜像源 在终端执行 一行命令,编辑配置文件sudo tee /etc/docke…...
Linux System V - 消息队列与责任链模式
概念 消息队列是一种以消息为单位的进程间通信机制,允许一个或多个进程向队列中发送消息,同时允许一个或多个进程从队列中接收消息。消息队列由内核维护,具有以下特点: 异步通信:发送方和接收方不需要同时运行&#x…...
k2路由器登录校园网
教程1刷入Breed,并手动刷入Padavan固件:斐讯K1、K2、K2P 刷机、刷入Breed 辅助工具 | tb (tbvv.net) Padavan下载网址: 我用的是: Padavan 登录的网址是 192.168.123.1 Padavan配置教程: 先用网线连上校园网&#…...
Docker基础实践与应用举例
Docker 是一个轻量级容器化平台,通过将应用及其依赖打包到容器中,实现快速部署和环境一致性。以下是 Docker 的实践与应用场景举例,结合具体操作步骤: 一、基础实践 1. 快速启动一个容器 # 运行一个Nginx容器,映射宿…...
EndNote与Word关联:科研写作的高效助力
在科研领域,文献管理与论文写作是紧密相连的重要环节。EndNote作为一款强大的文献管理工具,与Word实现有效关联后,能极大地提升科研写作效率。本文将详细介绍EndNote与Word关联的方法、关联后的优势、常见问题及解决办法,助力科研…...
用PyTorch从零构建 DeepSeek R1:模型架构和分步训练详解
DeepSeek R1 的完整训练流程核心在于,在其基础模型 DeepSeek V3 之上,运用了多种强化学习策略。 本文将从一个可本地运行的基础模型起步,并参照其技术报告,完全从零开始构建 DeepSeek R1,理论结合实践,逐步…...
SOME/IP-SD -- 协议英文原文讲解2
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.2 S…...
Matlab——图像保存导出成好看的.pdf格式文件
点击图像的右上角,点击第一个保存按钮键。...
Mybatis常用动态 SQL 相关标签
1. <if> 用于条件判断,当满足条件时执行对应的 SQL 片段。 示例: <select id"findUser" resultType"User">SELECT * FROM usersWHERE 11<if test"name ! null and name ! ">AND name #{name}</if><if…...
计算机网络与通讯知识总结
计算机网络与通讯知识总结 基础知识总结 1)FTP:文件传输 SSH:远程登录 HTTP:网址访问 2)交换机 定义:一种基于MAC地址实现局域网(LAN)内数据高速转发的网络设备,可为接入设备提供独享通信通道。 - 核心功能: 1.数据链路层(OSI第二层)工作,通过MAC地址…...
Redis 通用命令
Redis 通用命令 文章目录 Redis 通用命令 1. 启动redis 1.1 前台启动1.2 后台启动1.3 开机自启 2.Redis命令行客户端3. 常见命令 3.1 help3.2 KEYS3.3 DEL3.4 EXISTS3.5 EXPIRE&TTL 1. 启动redis 1.1 前台启动 在安装好redis后,我们可以在任意目录输入以…...
【idea问题排查技巧】
以下是针对 IDEA 中 日志打标(动态标记) 和 全链路追踪 功能的分步详解,结合具体场景和操作截图说明,帮助快速掌握实战技巧。 一、动态日志打标:不修改代码输出关键信息 1. 断点日志打印(非侵入式打标) 场景:在调试时,需要临时查看某个变量的值,但不想修改代码添加…...
VSCode自定义快捷键和添加自定义快捷键按键到状态栏
VSCode自定义快捷键和添加自定义快捷键按键到状态栏 📄在VSCode中想实现快捷键方式执行与某些指令操作进行绑定,可以通过配置组合式的键盘按键映射来实现,另外一种方式就是将执行某些特定的指令嵌入在面板菜单上,在想要执行的时候…...
【Redis 原理】通信协议 内存回收
文章目录 通信协议--RESP内存回收内存过期策略惰性删除周期删除 内存淘汰策略 通信协议–RESP Redis是一个CS架构的软件,通信一般分两步(不包括pipeline和PubSub): 客户端(client)向服务端(se…...
AWS - Redshift - 外部表读取 Parquet 文件中 timestamp 类型的数据
问题: 通过 Redshift Spectrum 功能可以读取 S3 中的文件,当读取 Parquet 文件时,如果列格式设置为 timestamp, 通过 psql 客户端读取会出现以下错误: testdb# select * from myspectrum_schema_0219.test_ns; ERROR…...
H5--开发适配
在 H5 开发中,适配不同设备和屏幕尺寸至关重要,它能确保页面在各种环境下都有良好的显示效果和用户体验。以下介绍几种常见的 H5 开发适配方案: 视口(Viewport)设置 视口单位是相对于浏览器视口的尺寸进行度量的单位&…...
llama-factory部署微调方法(wsl-Ubuntu Windows)
llama-factory项目GitHub地址:GitHub - hiyouga/LLaMA-Factory: Unified Efficient Fine-Tuning of 100 LLMs & VLMs (ACL 2024) wsl-Ubuntu: 1.获取项目 git clone https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factory/ 2.安装环境…...
【Unity】鱼群效果模拟
鱼群效果模拟 文章目录 鱼群效果模拟Boid算法实现方式version1_CPUversion2_GPUversion3_Multilaterationversion4_Bitonic_Sorting (GPU友好)version5_Skinning (TODO) 细节项优化项参考链接 Boid算法 Boid算法是一种模拟群体行…...
C++ 编程语言简介
C 是一种通用编程语言,它是作为 C 语言的增强而开发的,以包含面向对象的范例。它是一种命令式和编译语言。 C 是一种高级的通用编程语言,专为系统和应用程序编程而设计。它由贝尔实验室的 Bjarne Stroustrup 于 1983 年开发,作为…...
Day15-后端Web实战-登录认证——会话技术JWT令牌过滤器拦截器
目录 登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技术 2.3 JWT令牌2.3.1 介绍2.3.2 生成和校…...
迪威模型:引领 3D 模型轻量化技术革新
在数字化时代,3D 模型的应用领域愈发广泛,从影视制作、游戏开发到工业设计、建筑仿真等,都离不开 3D 模型的支持。然而,随着模型复杂度的不断提高,文件体积也日益庞大,这给存储、传输和加载带来了极大的挑战…...
大学本科教务系统设计方案,涵盖需求分析、架构设计、核心模块和技术实现要点
以下是大学本科教务系统的设计方案,涵盖需求分析、架构设计、核心模块和技术实现要点: 大学本科教务系统设计方案 一、需求分析 1. 核心用户角色 角色功能需求学生选课/退课、成绩查询、课表查看、学分统计、考试报名、学业预警教师成绩录入、课程大纲上传、教学进度管理、…...
安装Liunx(CentOS-6-x86_64)系统
一:下载与安装Liunx(CentOS-7-x86_64) 1.下载: CentOS-6.10-x86_64-bin-DVD1.iso 2.安装: 按照自己的需求来 下载的镜像文件地址 加载完成后设置 查看网络和本地ip 3.配置仓库(用于yum下载࿰…...
DeepSeek开源周 Day01:从FlashMLA背后原理回顾KV Cache
FlashMLA 今天DeepSeek开源周第一天,开放了FlashMLA仓库,1小时内星标1.6k! FlashMLA 是一个高效的 MLA 解码内核,专为 Hopper GPU 优化,适用于可变长度序列。该项目目前发布了 BF16 和具有 64 块大小分页 kvcache 的功…...
java23种设计模式-工厂方法模式
工厂方法模式(Factory Method Pattern)学习笔记 🌟 定义 工厂方法模式属于创建型设计模式,定义一个创建对象的接口,但让子类决定实例化哪一个类。将类的实例化操作延迟到子类,是面向对象设计中"开闭…...
数据驱动未来!天合光能与永洪科技携手开启数字化新篇章
在信息化时代的今天,企业间的竞争早就超越了传统产品与服务的范畴,新的核心竞争力即——数据处理能力和信息技术的应用。作为数据技术领域的领军者,永洪科技凭借其深厚的技术积累和丰富的行业经验,成功助力天合光能实现数字化升级…...
【C++设计模式】工厂方法设计模式:深入解析从基础到进阶
1. 引言 在软件开发的世界里,设计模式如同巧妙的建筑蓝图,为解决常见问题提供了行之有效的方案。工厂方法模式作为一种广受欢迎的创建型设计模式,以其独特的优势在众多项目中得到广泛应用。它不仅能够为对象的创建提供通用且灵活的方式,还能有效隐藏实现细节,提升代码的可…...
Vue 3 + Vite 项目中配置代理解决开发环境中跨域请求问题
在 Vue 3 Vite 项目中,配置代理是解决开发环境中跨域请求问题的常见方法。通过在 Vite 的配置文件中设置代理,可以将前端请求转发到后端服务器,从而避免浏览器的同源策略限制。 1. 创建 Vue 3 Vite 项目 首先,确保你已经安装了…...
2.3 变量
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 变量是用来存放某个值的数据,它可以表示一个数字、一个字符串、一个结构、一个类等。变量包含名称、类型和值。在代码中…...
16、Python面试题解析:python中的浅拷贝和深拷贝
在 Python 中,浅拷贝(Shallow Copy) 和 深拷贝(Deep Copy) 是处理对象复制的两种重要机制,它们的区别主要体现在对嵌套对象的处理方式上。以下是详细解析: 1. 浅拷贝(Shallow Copy&a…...
BUUCTF-Web方向21-25wp
目录 [HCTF 2018]admin弱口令session伪造 [MRCTF2020]你传你🐎呢[护网杯 2018]easy_tornado[ZJCTF 2019]NiZhuanSiWei[MRCTF2020]Ez_bypass第一层第二层 [HCTF 2018]admin 打开环境,有三处提示,一个跳转链接,一个登录注册&#x…...
elementPlus 中表单验证方法(手机号、正整数、邮箱)
1、手机号验证 <el-form ref"formRef" :model"form" :rules"rule" label-width"100px"><el-form-item label"联系电话" prop"mobile"><el-input type"tel" v-model"form.mobile&q…...
阿里云 ACS:高效、弹性、低成本的容器计算解决方案
阿里云的 容器计算服务(Alibaba Cloud Container Service, ACS) 是一种 Serverless 容器计算 解决方案,提供高度弹性、低成本、易管理的 Kubernetes(K8s)容器运行环境。用户无需关注底层服务器资源,而是直接…...
启动Redis报错记录
突然启动Redis就报了个错:‘Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。‘ 查了下解决方案,应该是6379端口已绑定,服务没有关闭。 需要输入命令redis-cli 再输入shutdown 但又出现了新的问题&…...
springBoot统一响应类型2.0版本
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
ubuntu离线安装Ollama并部署Llama3.1 70B INT4
文章目录 1.下载Ollama2. 下载安装Ollama的安装命令文件install.sh3.安装并验证Ollama4.下载所需要的大模型文件4.1 加载.GGUF文件(推荐、更容易)4.2 加载.Safetensors文件(不建议使用) 5.配置大模型文件 参考: 1、 如…...
Unity游戏制作中的C#基础(4)数组声明和使用
一、数组的声明 在 C# 中,声明数组有多种方式,每种方式都有其适用的场景,下面为你逐一详细介绍: 1. 直接初始化声明 这种方式直观且便捷,在声明数组的同时就为其赋初值,让数组从诞生之初就拥有了具体的数据…...
自定义SpringBoot Starter
✅自定义SpringBoot Starter SpringBoot 的 starter 可以帮我们简化配置,非常的方便,定义起来其实也不复杂,我的项目中定义了很多 starter,比如business-job就是一个 stater,以他为例,介绍下如何定义 star…...
电脑经常绿屏(蓝屏)怎么办(解决方法)?
一、排查系统与驱动问题 进入安全模式修复系统 强制重启电脑 3 次触发恢复环境,选择 疑难解答 > 高级选项 > 启动设置 > 重启,按 F5 或 5 进入带网络连接的安全模式3。 在安全模式下,尝试卸载最近安装的软件或更新,尤其…...
IO/网络IO基础全览
目录 IO基础CPU与外设1. 程序控制IO(轮询)2. 中断中断相关知识中断分类中断处理过程中断隐指令 3. DMA(Direct Memory Access) 缓冲区用户空间和内核空间IO操作的拷贝概念传统IO操作的4次拷贝减少一个CPU拷贝的mmap内存映射文件(m…...
DPVS-5: 后端服务监控原理与测试
后端监控原理 被动监测 DPVS自带了被动监控,通过监控后端服务对外部请求的响应情况,判断服务器是否可用。 DPVS的被动监测,并不能获取后端服务器的详细情况,仅仅通过丢包/拒绝情况来发觉后端服务是否可用。 TCP session state…...
前端基础知识
1. 变量和常量 1.1 变量 // 变量let name Jacklet age 20name lisiage 18 1.2 常量 // 常量const PI 3.14// PI 3.1415926 // error,常量不可重新赋值const articleList []const user {name: vue3,age: 10} 1.3 const 声明的数组和对象 因为数组和对象在…...
从零到一学习c++(基础篇--筑基期十一-类)
从零到一学习C(基础篇) 作者:羡鱼肘子 温馨提示1:本篇是记录我的学习经历,会有不少片面的认知,万分期待您的指正。 温馨提示2:本篇会尽量用更加通俗的语言介绍c的基础,用通俗的语言去…...
Linux 第三次脚本作业
源码编译安装httpd 2.4,提供系统服务管理脚本并测试(建议两种方法实现) 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了) 3、解压httpd包 4、解压后的httpd包的文…...
C#与AI的交互(以DeepSeek为例)
C#与ai的交互 与AI的交互使用的Http请求的方式,通过发送请求,服务器响应ai生成的文本 下面是完整的代码,我这里使用的是Ollama本地部署的deepseek,在联网调用api时,则url会有不同 public class OllamaRequester {[Se…...
Sky Hackathon 清水湾的水 AI美食助手
这里写自定义目录标题 视频 视频 video...
基于SpringBoot的校园消费点评管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
企业财务数据分析-投资回报指标ROA
上一篇文章主要介绍了关于投资回报的核心指标ROE,其实还有一个比较关键的指标资产回报率指标(ROA),资产收益率是用来衡量企业盈利能力的重要财务分析指标。资产收益率越高,说明企业资产的利用效率越高,利用…...