MySQL的事务隔离级别
目录
事务隔离级别的概念
脏读(Dirty Read):
不可重复读(Non-Repeatable Read):
幻读(Phantom Read):
读未提交(Read Uncommitted)
读未提交隔离级别的特点
示例
优势和劣势
读已提交(Read Committed)
读已提交隔离级别的特点
示例
优势和劣势
可重复读(Repeatable Read)
可重复读隔离级别的特点
示例
优势和劣势
串行化(Serializable)
串行化隔离级别的特点
示例
优势和劣势
当涉及到数据库事务时,事务隔离级别是一个重要的概念,它决定了事务之间的相互影响程度。MySQL支持四种不同的事务隔离级别,分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。本文将详细介绍这些隔离级别,以及它们对数据库操作的影响。
事务隔离级别的概念
事务隔离级别是数据库管理系统(DBMS)用来控制多个事务之间互相干扰的级别。在多个事务同时运行时,一个事务的操作可能会影响到其他事务的结果,因此需要一种机制来管理这种互相干扰。不同的隔离级别提供了不同程度的隔离,以满足不同的应用需求。
MySQL定义了以下四种事务隔离级别:
读未提交(Read Uncommitted):最低级别,允许一个事务读取另一个事务尚未提交的数据。这可能导致脏读、不可重复读和幻读的问题。
读已提交(Read Committed):允许一个事务只读取其他已提交事务的数据。这可以避免脏读,但仍可能出现不可重复读和幻读的问题。
可重复读(Repeatable Read):默认隔离级别。在一个事务中,多次读取同一数据会得到相同的结果,即使其他事务对该数据进行了修改。这可以避免脏读和不可重复读,但可能出现幻读问题。
串行化(Serializable):最高级别,要求事务串行执行,即事务之间没有并发。可以避免脏读、不可重复读和幻读,但会影响并发性能。
脏读(Dirty Read)、不可重复读(Non-Repeatable Read)和幻读(Phantom Read)是与数据库隔离级别相关的三种问题,它们可能会导致数据的一致性问题,下面我举例介绍一下它们🤗:
脏读(Dirty Read):
定义:脏读是指一个事务读取到了另一个事务尚未提交的数据,当那个事务最终回滚时,读取的数据就变得无效或“脏”了。
示例:假设有两个银行账户,Alice 和 Bob。Alice 想要转账给 Bob 1000美元,但在她的事务还没有提交之前,Bob 的查询可能会显示他的余额增加了1000美元。然而,如果 Alice 的事务最终回滚,Bob 实际上并没有得到这1000美元。
不可重复读(Non-Repeatable Read):
定义:不可重复读是指在同一个事务中,多次读取相同数据时,得到了不同的结果。这是因为在事务执行期间,其他事务修改了数据。
示例:假设小明正在查询某本书的价格,结果是50美元。然后,他再次查询,但在这之间,另一个用户购买了这本书并将价格提高到100美元。因此,小明两次查询相同的数据得到了不同的结果,这就是不可重复读。
幻读(Phantom Read):
定义:幻读是指在同一个事务中,多次执行相同的查询,但由于其他事务插入新数据或删除现有数据,每次查询返回的结果集不一样。
示例:考虑一个图书馆数据库,小红正在查询某个作者的所有书籍。第一次查询返回了5本书,但在事务执行期间,另一个用户添加了一本新书,所以在第二次查询时,返回了6本书。这就是幻读,因为查询结果集似乎发生了变化,尽管小红的事务并没有修改任何数据。
不可重复读 和 幻读 区别在于不可重复读通常涉及到已存在数据的修改,而幻读涉及到数据的插入或删除,导致查询结果集的不一致性。
下面我会举出例子来详细介绍这四种隔离级别~~😁
读未提交(Read Uncommitted)
读未提交(Read Uncommitted)是事务隔离级别中最低的级别,也是最不严格的级别。在这个级别下,一个事务可以读取到其他事务尚未提交的修改,甚至是“脏数据”。这意味着在读未提交隔离级别下,数据的一致性和完整性可能受到破坏,因为其他事务的未提交更改可能会影响到正在运行的事务。以下是读未提交隔离级别的详细介绍和举例说明其优劣势。
读未提交隔离级别的特点
最低隔离级别:读未提交是MySQL中隔离级别中最低的级别,事务之间的隔离程度最低。
允许脏读:在读未提交隔离级别下,一个事务可以读取到其他事务尚未提交的数据修改,这种读取被称为“脏读”。脏读意味着一个事务可能会看到其他事务的临时更改,这些更改后来可能会被回滚。
高并发性:由于读未提交允许多个事务同时读取和修改相同的数据,因此在高并发环境下可以提供较好的性能。
示例
假设有两个人,小明和小红,他们共享一个可编辑的电子文档,比如一个共享笔记本。
- 小明正在编辑文档,他写了一句话:“明天要去购物。”
- 在小明提交他的编辑之前,小红开始查看文档。
- 由于"读未提交"的情况,小红可以看到小明写下的未提交的内容,即“明天要去购物”。
结果是,小红在她的查看中看到的文档内容与实际情况不符,因为她可以读取到小明的未提交修改。如果小明最终决定不去购物并将文档修改为“明天要去看电影”,那么小红看到的内容将是不准确的,因为她在小明提交修改之前就已经看到了未提交的信息。
优势和劣势
优势:
高并发性:读未提交隔离级别允许多个事务同时读取和修改数据,因此在高并发环境下可以提供较好的性能。
劣势:
脏读:最大的劣势是允许脏读,即一个事务可以读取到其他事务未提交的更改。这可能导致不一致的数据状态。
丢失更新:读未提交隔离级别还可能导致“丢失更新”问题,其中一个事务的更改可能会被另一个事务覆盖,因为它们同时修改相同的数据。
数据不一致性:读未提交隔离级别不提供数据一致性保证,因此对于需要严格数据一致性的应用来说,它通常是不合适的。
在大多数情况下,读未提交隔离级别都不建议使用,因为它的风险往往超过了性能优势。通常情况下,较高级别的隔离级别如“读已提交”或“可重复读”更适合大多数应用,因为它们提供了更好的数据一致性保证,同时仍具备良好的性能。只有在极少数特殊情况下,才会考虑使用读未提交隔离级别。
读已提交(Read Committed)
读已提交(Read Committed)是一种常见的事务隔离级别,它提供了一定程度的隔离,以确保事务之间不会读取到未提交的数据更改。接下来,我将详细介绍读已提交隔离级别,并提供一个示例来说明其优劣势。
读已提交隔离级别的特点
隔离程度: 读已提交隔离级别确保一个事务只能读取到已经提交的数据更改,不会读取到其他事务尚未提交的更改。这提供了一定程度的数据隔离,防止脏读问题的发生。
避免脏读: 读已提交隔离级别避免了脏读问题,即一个事务不会读取到其他事务未提交的数据更改。但仍可能出现不可重复读和幻读的问题。
示例
假设有一个在线商店的数据库,其中包含产品和订单信息。
用户A正在查询某个产品的库存数量。
与此同时,用户B正在执行一个任务,将该产品的库存数量减少5个单位。
在读已提交隔离级别下,用户A的查询操作只能读取到已经提交的库存数量,而不会读取到用户B尚未提交的减少5个单位的更改。
如果用户B成功完成并提交了任务,那么下一次用户A的查询将反映减少的库存数量。
优势和劣势
优势:
避免脏读: 读已提交隔离级别确保一个事务不会读取到其他事务尚未提交的数据更改,从而避免了脏读问题。
劣势:
不可重复读: 读已提交隔离级别允许不可重复读问题的发生。不可重复读是指在同一事务内的两次查询返回了不同的结果,这可能在某些情况下需要应用层面的处理来处理。
总之,读已提交隔离级别在绝大多数应用中是一个合理的选择,因为它提供了一定程度的隔离,同时避免了脏读问题。然而,如果应用需要更高的隔离级别,可以考虑使用更高级别的隔离级别,如“可重复读”。
可重复读(Repeatable Read)
可重复读(Repeatable Read)是一种事务隔离级别,提供了更高程度的隔离,以确保在同一事务内多次查询返回一致的结果。接下来,我将详细介绍可重复读隔离级别,提供一个示例来说明其优劣势。
可重复读隔离级别的特点
隔离程度: 可重复读隔离级别确保一个事务在执行期间可以多次读取相同的数据,并且不会受到其他事务的影响。这提供了高度的数据隔离,避免了脏读、不可重复读和幻读问题。
避免脏读: 可重复读隔离级别避免了脏读问题,即一个事务不会读取到其他事务未提交的数据更改。
避免不可重复读: 可重复读隔离级别确保在同一事务内的两次查询返回一致的结果,避免了不可重复读问题。
示例
假设有一个银行的数据库,其中包含账户余额的数据。
用户A正在执行一个转账操作,将100美元从他的账户转移到用户B的账户。
同时,用户B正在查询他的账户余额。
在可重复读隔离级别下,用户B的查询操作只能读取到事务开始时的账户余额,不会读取到用户A的转账操作尚未提交的更改。
即使用户A成功执行了转账操作并提交了事务,用户B的查询操作仍然只能看到事务开始时的余额。
优势和劣势
优势:
高度隔离: 可重复读隔离级别提供了高度的隔离,确保在同一事务内的多次查询返回一致的结果,避免了脏读、不可重复读和幻读问题。
数据一致性: 可重复读隔离级别确保事务内的查询不受其他事务的干扰,从而维护了数据的一致性。
劣势:
并发性降低: 由于提供了更高的隔离,可重复读隔离级别可能导致并发性降低,因为多个事务之间无法同时访问相同的数据。
总之,可重复读隔离级别通常在需要高度数据隔离和一致性的应用中是一个合理的选择。然而,它可能会导致并发性降低,因此在某些情况下,需要权衡选择适当的隔离级别。
串行化(Serializable)
串行化(Serializable)是最高级别的事务隔离级别,它提供了最强大的数据隔离,确保在事务之间的完全隔离,不会出现脏读、不可重复读、幻读或其他并发问题。让我们详细介绍串行化隔离级别,并提供一个示例来说明其优劣势。
串行化隔离级别的特点
最高隔离程度: 串行化隔离级别确保事务之间的完全隔离,每个事务都仿佛在单独运行,不会看到其他事务的未提交更改。
避免脏读、不可重复读和幻读: 串行化隔离级别彻底避免了脏读、不可重复读和幻读等问题。一个事务在读取数据时,如果另一个事务正在修改相同的数据,它将被阻塞,直到另一个事务完成。
保证一致性: 串行化隔离级别确保数据的一致性,即使在高并发环境下也不会出现数据不一致的情况。
示例
假设有一个银行的数据库,其中包含账户余额的数据。
用户A正在执行一个转账操作,将100美元从他的账户转移到用户B的账户。
同时,用户B正在查询他的账户余额。
在串行化隔离级别下,用户B的查询操作将会被阻塞,直到用户A的事务完成。因为用户A的事务正在修改用户B的账户,数据库会确保不会允许用户B查询到中间状态的余额。
只有当用户A的事务完成后,用户B的查询操作才会继续执行,此时用户B将看到正确的账户余额。
优势和劣势
优势:
1. 最高隔离: 串行化隔离级别提供了最高级别的隔离,确保事务之间完全独立运行。
2. 数据一致性: 串行化隔离级别确保数据的一致性,不会出现并发问题,即使在高并发环境下也能维护数据的完整性。
劣势:
1. 性能开销: 串行化隔离级别可能导致性能开销较大,因为事务需要等待锁释放,可能会导致事务执行时间延长。
2. 资源争夺: 高并发情况下,事务可能会争夺资源,导致一些事务等待时间过长。
串行化隔离级别适用于那些对数据一致性要求极高的应用,例如金融系统。然而,它的性能开销较大,不适用于所有场景,因此需要谨慎选择隔离级别。
本期就到这里啦,喜欢的友友可以三连支持一下博主噢!🤩
相关文章:
MySQL的事务隔离级别
目录 事务隔离级别的概念 脏读(Dirty Read): 不可重复读(Non-Repeatable Read): 幻读(Phantom Read): 读未提交(Read Uncommitted) 读未提交…...
企业大语言模型智能问答的底层基础数据知识库如何搭建?
企业大语言模型智能问答的底层基础数据知识库搭建是一个复杂而关键的过程。下面将详细介绍如何搭建这样一个知识库。 确定知识库的范围和目标: 首先,需要明确知识库的范围,确定所涵盖的领域和主题。这可以根据企业的业务领域和用户需求来确…...

【腾讯云 Cloud Studio 实战训练营】使用python爬虫和数据可视化对比“泸州老窖和五粮液4年内股票变化”
Cloud Studio 简介 Cloud Studio是腾讯云发布的云端开发者工具,支持开发者利用Web IDE(集成开发环境),实现远程协作开发和应用部署。 现在的Cloud Studio已经全面支持Java Spring Boot、Python、Node.js等多种开发模板示例库&am…...

Linux之Shell概述
目录 Linux之Shell概述 学习shell的原因 shell是什么 shell起源 查看当前系统支持的shell 查看当前系统默认shell Shell 概念 Shell 程序设计语言 Shell 也是一种脚本语言 用途 Shell脚本的基本元素 基本元素构成: Shell脚本中的注释和风格 Shell脚本编…...

手写Spring:第2章-创建简单的Bean容器
文章目录 一、目标:创建简单的Bean容器二、设计:创建简单的Bean容器三、实现:创建简单的Bean容器3.0 引入依赖3.1 工程结构3.2 创建简单Bean容器类图3.3 Bean定义3.4 Bean工厂 四、测试:创建简单的Bean容器4.1 用户Bean对象4.2 单…...
在Windows上通过SSH公私钥实现无密码登录Linux
在Windows上通过SSH公私钥实现无密码登录Linux 在Windows上生成SSH密钥对: 打开命令提示符或PowerShell窗口。 输入以下命令生成SSH密钥对: ssh-keygen -t rsa -b 4096按照提示输入密钥的保存路径和密码(可选)。 在指定的路径下…...

使用ppt和texlive生成eps图片(高清、可插入latex论文)
一、说明 写论文经常需要生成高清的图片插入到论文中,本文以ppt画图生成高质量的eps图片的实现来介绍具体操作方法。关于为什么要生成eps图片,一个是期刊要求(也有不要求的),另一个是显示图像的质量高。 转化获得eps…...
html5学习笔记19-SSE服务器发送事件(Server-Sent Events)
https://www.runoob.com/html/html5-serversentevents.html 允许网页获得来自服务器的更新。类似设置回调函数。 if(typeof(EventSource)!"undefined"){var sourcenew EventSource("demo_sse.php");source.onmessagefunction(event){document.getElement…...

高效数据湖构建与数据仓库融合:大规模数据架构最佳实践
文章目录 数据湖和数据仓库:两大不同理念数据湖数据仓库 数据湖与数据仓库的融合统一数据目录数据清洗和转换数据安全和权限控制数据分析和可视化 数据湖与数据仓库融合的优势未来趋势云原生数据湖自动化数据处理边缘计算与数据湖融合 结论 🎉欢迎来到云…...
Java学习笔记——35多线程02
线程同步 线程同步卖票案例同步代码块同步方法块 线程安全的类StringBufferVectorHashtable Lock锁 线程同步 卖票案例 public class SellTicket implements Runnable{private int tickets10;Overridepublic void run(){while (true){if(tickets>0){System.out.println(Th…...

每日刷题-3
目录 一、选择题 二、编程题 1、计算糖果 2、进制转换 一、选择题 1、 解析:在C语言中,以0开头的整数常量是八进制的,而不是十进制的。所以,0123的八进制表示相当于83的十进制表示,而123的十进制表示不变。printf函数…...

储能直流侧计量表DJSF1352
安科瑞 华楠 具有CE/UL/CPA/TUV认证 DJSF1352-RN导轨式直流电能表带有双路直流输入,主要针对电信基站、直流充电桩、太阳能光伏等应用场合而设计,该系列仪表可测量直流系统中的电压、电流、功率以及正反向电能等。在实际使用现场,即可计量总…...
机器学习报错合集(持续更新)
文章目录 1 列表转numpy,尺寸不均匀问题 1 列表转numpy,尺寸不均匀问题 ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (4,) inhomogeneous pa…...
【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】驱动移植
一、环境介绍 RK3588主板搭载Android12操作系统,内核是Linux5.10,使用ST的六轴传感器LSM6DSR芯片。 二、芯片介绍 LSM6DSR是一款加速度和角速度(陀螺仪)六轴传感器,还内置了一个温度传感器。该芯片可以选择I2C,SPI通讯,还有可编程终端,可以后置摄像头等设备,功能是很…...

day-41 代码随想录算法训练营(19)动态规划 part 03
343.整数拆分 思路: 1.dp存储的是第i个数,拆分之后最大乘积2.dp[i]max(dp[i],max(j*(i-j),j*dp[i-j]));3.初始化:dp[0]dp[1]0,dp[2]1;4.遍历顺序:外层循环 3-n,内层循环 1-i 2.涉及两次取max: dp[i] 表…...
K8S安装部署 初始化操作(一)
准备好服务器和服务器资源 ip hostnameip资源 (2核2G也可以)k8s-master 192.168.37.1184核 4G 40G硬盘k8s-node1192.168.37.1192核 2G 20G硬盘k8s-node2192.168.37.1202核 2G 20G硬盘 初始操作三台同时执行 1、关闭防火墙 [rootlocalhost ~]# s…...

【多线程案例】单例模式(懒汉模式和饿汉模式)
文章目录 1. 什么是单例模式?2. 立即加载/“饿汉模式”3. 延时加载/“懒汉模式”3.1 第一版3.2 第二版3.3 第三版3.4 第四版 1. 什么是单例模式? 提起单例模式,就必须介绍设计模式,而设计模式就是在软件设计中,针对特殊…...

Anaconda - 操作系统安装程序 简要介绍
Anaconda 简要介绍 1. Anaconda 简介2. Anaconda 体系结构3. Anaconda 开发模型4. Anaconda 启动概述5. Anaconda 源码1. 接口2. 自定义组件3. 硬盘分区:使用python-blivet包4. Bootloader5. 各个步骤的配置:6. 安装软件包:7. 安装控制&#…...
【数据库设计】向量搜索HNSW算法优化
做向量存储的过程中,遇到向量搜索的情况处理,HNSW算法是目前向量搜索的主要算法之一,采用的是图算法,主要的问题是使用内存大,训练时间长。做算法优化过程中获得部分技巧,分享出来。 一、算法本身的优化 对…...

多通道振弦数据记录仪应用桥梁安全监测的关键要点
多通道振弦数据记录仪应用桥梁安全监测的关键要点 随着近年来桥梁建设和维护的不断推进,桥梁安全监测越来越成为公共关注的焦点。多通道振弦数据记录仪因其高效、准确的数据采集和处理能力,已经成为桥梁安全监测中不可或缺的设备。本文将从以下几个方面…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...