MySQL事务的隔离级别

news2024/11/26 0:49:17

🏆今日学习目标:

🍀MySQL事务的隔离级别
✅创作者:林在闪闪发光
⏰预计时间:30分钟
🎉个人主页:林在闪闪发光的个人主页

 🍁林在闪闪发光的个人社区,欢迎你的加入: 林在闪闪发光的社区

目录

        一、什么是事务

        二、为什么需要事务?

        三 事务的特性(ACID) 

        四 并发事务带来哪些问题 

        五 事务隔离级别 

        六 解决并发事务带来问题的两种基本方式


一、什么是事务

事务是指单个逻辑工作单元执行得一系列操作,要么都做,要么都不做,是不可分割的工作单位,是数据库环境中的的最小工作单元。 

事务最经典栗子也经常被拿出来的栗子就是银行转账了。

比如小明要给小红转账1000元,这个转账会涉及到两个关键操作:将小明的余额减1000元,将小红的余额减1000元。万一这两个操作之间突然出现错误,导致小明余额减少但是小红余额没有增加,这种情况是肯定不允许的。事务就是保证这两个关键操作要么都成功,要么都不成功。

 二、为什么需要事务?

事务包含了一组操作,这些操作可以是一条SQL语句、一组SQL语句或整个程序。如果其中一个操作不成功,这些操作都不会执行,前面执行的操作也会回滚原状态,用来保证数据的一致性和完整性。例如,就像银行转账,张三给李四转账,只有当张三的钱转走了,并且李四账户的钱收到了之后才会事务提交,否则事务会回滚到转账前的状态,保证数据的一致性,保证数据不会出错

三 事务的特性(ACID) 

原子性
事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败。
任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成。

一致性
事务的一致性是指事务在执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。
比如:张三给李四转钱,不可能张三被扣了钱,李四没有加钱。

隔离性
事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同事物并非操作相同数据时,每个事务都有完整的数据空间。
一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。

持久性
事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态

四 并发事务带来哪些问题 

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题:

脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。

丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。

不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

不可重复度和幻读区别:

不可重复读的重点是修改,幻读的重点在于新增或者删除。

例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导 致A再读自己的工资时工资变为 2000;这就是不可重复读。

例2(同样的条件, 第1次和第2次读出来的记录数不一样 ):假某工资单表中工资大于3000的有4人,事务1读取了所有工资大于3000的人,共查到4条记录,这时事务2 又插入了一条工资大于3000的记录,事务1再次读取时查到的记录就变为了5条,这样就导致了幻读

五 事务隔离级别 

SQL标准定义了四个隔离级别:

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。

Read uncommitted(读未提交)
读未提交,就是一个事务可以读取另一个未提交事务的数据。

事例:我的工资是1.5万,这个月发工资,财务不小心按错了数字,还没有来得及提交事务,就在这个时候,我发现的工资变为了1.9万元,我以为涨工资了高兴的飞起 ,财务发现不对,回滚了事务,将工资改回了1.5万元再提交。
分析:实际我这个月的工资还是1.5万,但是我看到的是1.9万。我看到的是老板还没提交事务时的数据。这就是脏读。

Read committed(读提交)
读提交,就是一个事务要等另一个事务提交后才能读取数据。

事例:某已婚男欲购买一套新房准备迎接新生命的到来,购房款 330万 ,付款的时候查询自己账号余额 360万(第一次查询),就在这个时候,该已婚男子的爱人,购买了理财产品,价值50万,并提交事务;该已婚男使用POS机付房款的时候发现钱不够了(第二次查询需要等待爱人支出事务提交完成)。
分析:如果有事务对数据进行更新(UPDATE)操作时,读取数据事务要等待这个更新操作事务提交后才能读取数据,有效的避免脏读,但是一个事务进行了两次相同的查询而返回了不同的数据,这就是不可重复读。

Repeatable read(重复读)
重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。

事例:某已婚男欲购买一套新房准备迎接新生命的到来,购房款 330万 ,付款的时候查询自己账号余额 360万(第一次查询),在这个时候,该已婚男子的爱人无法从该已婚男账户转出余额,接下来就可以正常付款了。
分析:重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。

Serializable (序列化)
Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
 

六 解决并发事务带来问题的两种基本方式

写-写操作
在写-写操作下会发生脏写的现象,任何一种隔离级别都不允许这种现象的发生,所以在多个未提交事务相继对一条记录进行改动时,需要让它们排队执行。这个排队的过程其实是通过加锁来实现的。

这个“锁”本质上是一个内存中结构,在事务执行之前本来是没有锁的。当一个事务相对这条记录进行改动时,首先会看看内存中有没有与这条记录关联的锁结构,如果没有们就会在内存中生成一个锁结构与之关联。

读-写或者写-读操作
读-写或者写-读操作会出现脏读,不可重复读,幻读的现象。有两种可选的解决方案。

方案一:读操作使用多版本并发控制(MVCC),写操作进行加锁。
方案二:读、写操作都采用加锁的方式。

一致性读

事务利用MVCC进行的读取操作称为一致性读,或者一致性无锁读,所有普通的SELECT语句在READ COMMITTEDPEPEATABLE READ隔离级别下都算是一致性读。
一致性读并不会读表中的任何记录进行加锁操作,其他事务可以自由地对表中的记录进行改动。

锁定读
共享锁和独占锁

共享锁:简称S锁,在事务要读取一条记录时,需要先获取该记录的S锁。
独占锁:也常称为排他锁,简称X锁,在事务要该改动一条记录时,需要先获取该记录的X锁。
假如事务T1首先获取一条记录的S锁,之后事务T2接着也要访问这条记录。

如果事务T2想要再获取一条记录的S锁,之后事务T2也会获得该锁,也就是两条事务同时持有S锁。
如果事务T2想要再获取一条记录的X锁,那么此操作会被阻塞,直到事务T1提交之后将S锁释放掉


如果有写的不对的地方 欢迎小伙伴指出 我们一起学习 共同进步 谢谢大家

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C与数据结构】——寒假提高每日练习Day2

一共16日的练习,分为选择题与编程题,涵盖了C语言所学以及数据结构的重点,以及一些秋招、春招面试的高频考点,难度会随着天数而上升。1-8day为C语言,9-16day为数据结构。 (建议在电脑客户端进行&#xff0c…

docker中的数据卷

目录 1. 为什么使用数据卷 2. 数据卷基本操作 2.1 创建数据卷 2.2 查看数据卷 2.3 查看数据卷详细信息 2.4 数据卷删除 3. 数据卷的使用 3.1 先创建数据卷再挂载 3.2 直接挂载宿主机目录 3.3 只读数据卷 4. 数据卷容器 4.1 新建数据卷容器 4.2 新建一个容器来使用数…

Nacos学习笔记 (8)服务发现基础应用

1. 什么是服务发现 在微服务架构中,整个系统会按职责能力划分为多个服务,通过服务之间协作来实现业务目标。这样在我们的代码中免不了要进行服务间的远程调用,服务的消费方要调用服务的生产方,为了完成一次请求,消费方…

求空间曲线的切线,法平面

求空间曲线的切线,法平面:归结为求空间曲线的切向量 进而用点向式直线方程表示出切线,点法式方程表示出法平面 情况一:空间曲线以参数式给出,求切向量时直接求导即可,如下题 情况二:空间曲线…

ROS2 基础概念 话题

ROS2 基础概念 话题1. Topics2. rqt_graph3. 话题4. 话题类型5. 话题发布6. 话题频率1. Topics 话题是节点交换消息的总线 节点可以向任意数量的话题发布数据,并同时订阅任意数量的话题 2. rqt_graph 将使用rqt_graph来可视化不断变化的节点和话题,以…

云服务器ECS入门及云上网站部署

云服务器ECS入门及云上网站部署 一、什么是云服务器ECS 云服务器ECS (Elastic Compute Service) 是阿里云提供的性能卓越、稳定可靠、弹性扩展的laaS(Infrastructure as a Service) 级别云计算服务 云服务器ECS免去了您采购IT硬件的前期准备,让您像使用水、电、天…

JavaScript操作BOM对象

BOM:浏览器对象模型 window代表浏览器窗口 >window.alert(1) undefined >window.innerHeight //浏览器内部高度 242 >window.innerWidth 1229 >window.outerHeight //浏览器外部高度 824 >window.outerWidth 1536 Navigator,封装了浏…

【Linux】第六部分 远程登录

【Linux】第六部分 远程登录 文章目录【Linux】第六部分 远程登录6. 远程登录6.1 配置hosts映射文件6.2 xshell和xftp的使用总结6. 远程登录 6.1 配置hosts映射文件 为什么要配置呢?利于后续我们进行连接方便,就比如:我们没有办法记住很多手机号,但是我们可以记住人名,我们打…

【20221225】【剑指1】链表

1、从尾到头打印链表 可以用rbegin,rend;也可以用reverse翻转数组。 2、如果是翻转链表的话(双指针法,用虚拟头节点依次翻转):https://blog.csdn.net/HYAIWYH/article/details/127118468?ops_request_mi…

java ssm 摄影约拍系统的设计

目录 第一章 绪论 5 1.1 研究背景 5 1.2系统研究现状 5 1.3 系统实现的功能 6 1.4系统实现的特点 6 1.5 本文的组织结构 6 第二章开发技术与环境配置 7 2.1 Java语言简介 7 2.2JSP技术 8 2.3 MySQL环境配置 8 2.4 MyEclipse环境配置 9 2.5 mysql数据库介绍 9 2.6 B/S架构 9 第三…

6、集合介绍

文章目录6、集合6.1 介绍6.2 常用接口和类6.3 ArrayList6.3.1 介绍6.3.2 基本操作6.3.3 常用方法6.4 LinkedList6.4.1 基本操作6.4.2 常用方法6.5 泛型6.5.1 介绍6.5.2 基本使用6.6 比较器6.7 ArrayList和LinkedList的比较6.8 HashSet6.8.1 介绍6.8.2 常用方法6.8.3 重复数据6.…

Attetion is all you need论文阅读笔记

Attetion is all you need 参考:沐神( 沐神_论文精讲_Attention is all you need) 1、Abstract 主流的序列转录模型(给一个序列生成另一个序列,比如机器翻译,给一句英文,生成一句中文&#x…

数据可视化大屏应急管理综合指挥调度系统完整案例详解(PHP-API、Echarts、百度地图)

文章目录项目说明一、项目说明单位信息数据库字段:资源数据库字段项目需求二、项目开发1.项目分析2.引入库3.项目开发(1)地图容器构建(2)筛选和返回按钮事件(3)企业筛选功能(4&#…

【java】stream流

文章目录体验stream流stream流的生成方式Stream流的常见中间操作方法Stream流的常见中间操作方法Stream流的常见终结操作方法Stream流的练习Stream流的收集操作体验stream流 package heima.stream流;import java.util.ArrayList;public class P1 {public static void main(Stri…

node.js+uni计算机毕设项目基于微信小程序的肉鸡养殖管理平台LW(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

第二十四章 数论——质数(2)(详细讲解质数的筛选原理和证明!!)

第二十四章 数论——质数的筛选一、朴素筛法——埃氏筛法1、问题描述2、算法思路3、代码实现二、线性筛法——欧拉筛1、朴素筛法的弊端2、欧拉筛(1)算法思路(2)代码实现一、朴素筛法——埃氏筛法 1、问题描述 2、算法思路 我们从…

【折腾服务器 2】妖板 Intel N5105 + i226 主板安装 群晖、直通 SATA 控制器 教程

Catch UP 前期回顾,我在这台使用 N5105 和 Intel 226V 2.5G 网卡的电脑上安装了 ESXi 7.0 系统。文章在博客里有,可以去翻翻。 Chapter 1 网络环境准备 登录 VMWare ESXi,点击左侧的网络。 点击 虚拟交换机 有一个 vSwitch 0 这个是默认的&a…

抽象类与接口(Java系列6)

目录 前言: 1.抽象类 1.1抽象类的概念及语法 1.2 抽象类的特征 1.3抽象类的特性 2.接口 2.1接口的概念及语法 2.2接口的使用及特性 2.2.1接口的使用 2.2.2接口的特性 2.3实现多个接口 2.4接口的继承 3.抽象类与接口的区别 结束语: 前言&…

分布式理论之分布式选举

写在前面 一个国家需要领导人制定各种国家决策,一个军队也需要最高统领来制定各种军事决策,同理,一个分布式集群也需要一个领导,来协调整个集群的事务,比如保证数据一致性(这也是最重要的!),分…

uni-app学习总结

本文以B站黑马教程的uni-app项目实战视频为载体,总结uni-app相关用法,如有误,请指出~ 一、创建项目: HbuilderX工具-->文件-->新建-->项目---》选择uni--app项目,创建。 二、项目初始化: 去掉一…