猿创征文|全方位快速了解事务的4种隔离级别

news/2024/5/17 8:20:38/文章来源:https://blog.csdn.net/m0_48904153/article/details/126630012

MySQL事务隔离级别

  • 事务以及事务的隔离级别
    • 1. 概念
    • 2. 事务的特性
    • 3. 事务的隔离级别
      • 3.1 Q:那么为什么事务需要有隔离级别呢?
      • 3.2 Q:那么什么事务并发会产生的问题?
          • 总结:不可重复读的和幻读很容易混淆
      • 3.3 Q:事务的隔离级别分为哪几种?
      • 总结
    • 4. 举例说明隔离级别
      • 4.1 读未提交
      • 4.2 读已提交
      • 4.3 可重复读
      • 4.4 可串行化(可序列化)

事务以及事务的隔离级别

1. 概念

事务就是用户定义的一系列操作,这些操作可以视为一个完整的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。

数据库事务: 通常指对数据库进行读或写的一个操作序列(如,一条sql语句就是一个事务),这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;是数据库操作的最小工作单元。

2. 事务的特性

我们都知道事务四大基本特性,那就是ACID

  • 原子性(Atomicity):事务开始后所有操作,要么都做,要么都不做

  • 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏

    事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。

    如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态;

    比如A向B转账,不可能A扣了钱,B却没收到。

  • 隔离性(Isolation):一个事务的执行不能其它事务干扰;

    同一时间,只允许一个事务请求同一数据**,不同的事务之间彼此没有任何干扰**。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

  • 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

    指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的

3. 事务的隔离级别

3.1 Q:那么为什么事务需要有隔离级别呢?

A:事物隔离级别,是为了解决事务并发产生的问题;事物隔离级别越高,并发下产生的问题就越少,但付出的资源消耗也越大,所以我们要根据实际使用在并发性和性能之间做一个权衡,因此有了事物隔离级别。

3.2 Q:那么什么事务并发会产生的问题?

事务的并发执行可能会产生三种常见的问题:脏读、不可重复读、幻读

  • 脏读: 事务A读取了事务B更新的数据(但此时B还未回滚【提交数据】),那么A读取到的数据是脏数据;

    eg:事务A先执行,查到age=10;接着事务B执行,将age改成11,事务B未提交;接着继续事务A进行查询,得到age=11;但此时事务B还未提交,所以这就是读未提交,也就是我们所说的脏读

  • 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

  • 幻读: 系统管理员A学生的成绩按照等级分类,但是系统管理员B在这个时候插入了一条成绩记录,当系统管理员A修改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

总结:不可重复读的和幻读很容易混淆

不可重复读侧重于修改;
幻读侧重于新增或删除;

解决不可重复读的问题只需锁住满足条件的行( 行级锁);

解决幻读需要锁表(间隙锁防止幻读)

3.3 Q:事务的隔离级别分为哪几种?

MySql种事务的隔离级别分为四种:读未提交;读已提交;可重复读;串行化

  • 读未提交 read uncommitted :事务A会读到事务B还未提交的数据 (会出现:脏读,不可重复读,幻读)

    设置当前会话的隔离级别:set session transaction isolation level READ UNCOMMITTED;

  • 读已提交 read committed :事务A不会读到事务B还未提交的数据 (避免了脏读
    在读提交的隔离级别下,当事务B修改完数据尚未提交时,事务A是无法读取到修改的数据的;当事务B提交事务后,事务A才可以看到修改的结果

  • 可重复读 repeatable read:(MySQLd的默认隔离级别)(避免了脏读不可重复读
    可以发现,当事务B提交后,事务A查询的结果依然是事务A开启时读到的数据,这就是所谓的可重复读:

    也就是说事务开启时读到的数据,在事务提交前,是一致的,不会因为外面事务的修改提交而改变开启事务前读到的值。

  • 串行化 serializable :(避免了所有并发问题)读写数据都会锁住整张表;
    就是严格按照串行序列排队执行事务,一个事务A执行提交结束以后,事务B才会开启。

总结

隔离级别脏读不可重复读幻读
读未提交
读已提交×
可重复读××
串行化×××

4. 举例说明隔离级别

4.1 读未提交

设置A的隔离级别为read uncommitted

在这里插入图片描述
A:启动事务,A进行查询,得到初始数据;

在这里插入图片描述

B:启动事务,更新数据,但不提交;id=1,num=1改为num=10;

在这里插入图片描述

A:再次读取数据,发现读取到了B未提交的数据,这就是脏读;

在这里插入图片描述

B:回滚事务;

在这里插入图片描述

A:再次读取数据,发现数据变回初始状态;

在这里插入图片描述
总结: 先事务A,查到num=1;接着再事务B,将num改成10,接着继续事务A进行查询,得到num=10;但此时事务B还未提交,所以这既是读未提交,也就是我们所说的脏读

4.2 读已提交

设置A的隔离级别为read committed

在这里插入图片描述
A:启动事务,A进行查询,得到初始数据;

在这里插入图片描述

B:启动事务,更新数据,但不提交;id=1,num=1改为num=10;

在这里插入图片描述

A:再次读取数据,发现数据并未被修改;

在这里插入图片描述

B:提交事务;

在这里插入图片描述

A:再次读取数据,发现数据已经变化,说明提交的修改被事务中的A读到了,这就是不可重复读

在这里插入图片描述
总结:读已提交读隔解决了脏读的问题,但仍有不可重复读的问题;即事务A在两次查询的数据不一致。

4.3 可重复读

设置A的隔离级别为repeatable read

在这里插入图片描述
A:启动事务,此时数据为初始状态;

在这里插入图片描述

B:启动事务,更新数据,但不提交;

在这里插入图片描述

A:再次读取数据,发现数据未被修改;

在这里插入图片描述

B:提交事务;

在这里插入图片描述

A:再次读取数据,发现数据仍未发生变化,则说明可以重复读;

在这里插入图片描述

B:插入/更新一条新的数据记录,并提交

在这里插入图片描述

A:再次读取数据,发现数据未发生变化,虽然可以重复读了,但是却发现读的不是最新数据记录,这就是所谓的“幻读”

在这里插入图片描述

A:提交本次事务,再次读取数据,发现读取到了更新的数据

在这里插入图片描述
总结: 可重复读只允许读取已提交记录,也就是说事务开启时读到的数据,在事务提交前,是一致的,不会因为外面事务的修改提交而改变开启事务前读到的值。但是在事务A两次读取一个记录期间,事务B插入新纪录,事务A是可能在未提交之前读取不到更新的记录,这就是幻读

4.4 可串行化(可序列化)

设置A的隔离级别Serializable

在这里插入图片描述
A:启动事务,此时数据为初始状态

在这里插入图片描述
B:发现B此时进入了等待状态,原因是因为事务A尚未提交结束,只能等待;(此时,B可能会发生等待超时)

在这里插入图片描述

A:提交事务

在这里插入图片描述
B:发现插入成功

在这里插入图片描述
总结serializable完全锁定整张表,当事务B来查询同一份数据就必须等待,直到事务A完成并解除锁定为止。就是严格按照串行序列排队执行事务,事务B只有等待到事务A执行提交结束,事务B才会开启。因此性能上消耗比较大。

参考博文:https://www.jianshu.com/p/8d735db9c2c0

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

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

相关文章

Dubbo - 远程debug

由于Dubbo的特性是远程调用,因此正常来说无法在本地进行debug 因为你调用的方法在别台机器上跑,你只能知道给他的input和他返回的结果,但没办法知道这个接口内部的执行,所以也没办法在裡面打断点进行debug 就算在本地有dubbo代码…

UE4 C++学习 浅析UProperty属性说明符

浅析UE4 UPROPERTY本文就 UProperty是什么?以及UProperty怎么用?做一个简单的总结。 什么是UPROPERTY? 首先看下官方的解释: 感觉还是比较模糊没看懂有什么用,我们接着往下看要知道UPROPERTY有什么用,我们首先要知道反射(Refection)这个机制。这个机制在Java和C#等语言都…

freeswitch的3XX重定向

概述 sip协议标准RFC3261中,对3XX重定向有明确的定义。 freeswitch中如何使用3XX redirect的特性,如何落地,应用场景有哪些?环境 centos:CentOS release 7.0 (Final)或以上版本 freeswitch:v1.8.7 GCC:4.8.53XX重定向 RFC3261中对3XX的响应定义是这样的。 3xx response…

版本4校园兼职软件遇到的问题和解决方法

出现问题: 每次只能保存一位用户信息,后面输入用户信息前面的用户信息会被覆盖 出现原因及解决方法: 因为暂存的temp对象被定义为全局变量,所以每次进去都被刷新为新对象,将其 User temp new User(); 放在方法内即…

【JAVAWEB开发】基于Java+Servlet+Ajax+jsp网上购物系统设计实现

哈喽~大家好呀,这篇给的大家带来的是网上购物系统设计。在传统电商时代,用户是先有需求再购买,用户对平台较为依赖,商家对消费者很难有直接的影响力,而如今社交 电商解决了产品质量的信息不对称问题,电商已…

卷积神经网络卷积层公式,卷积神经网络层数计算

卷积神经网络算法是什么? 一维构筑、二维构筑、全卷积构筑。 卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(FeedforwardNeuralNetworks),是深度学习&a…

【校招VIP】[产品][一本][6分]简历原则上写一页

校招的简历原则上只能写一页,尤其是电子版。因为校招是集中面试,会有太多简历,所有人都只有一页的话,写两页的很容易被漏掉一页关注【校招VIP】公众号,回复【简历】,添加校招顾问微信,即可获取简历指导! 简历背景:21届一本产品 简历评分:6分 一、学员简历 ​​​二、…

安装mkimage工具,解决报错“Invalid CPU Type - valid names are:”

问题 前两天在编译博雅芯片厂商提供的内核时,总是无法编译通过,试了好几次都提示如下错误: Invalid CPU Type - valid names are: alpha, arm, x86, ia64, m68k, microblaze, mips, mips64, nios2, powerpc, ppc, s390, sh, sparc, sparc64…

神经网络架构图讲解教程,神经网络架构图讲解图

什么是全连接神经网络?怎么理解“全连接”? 1、全连接神经网络解析:对n-1层和n层而言,n-1层的任意一个节点,都和第n层所有节点有连接。即第n层的每个节点在进行计算的时候,激活函数的输入是n-1层所有节点的…

猿创征文|C++来时路 _ 重温经典之C++类和对象 | 三大特性之一 - 封装 | 腾讯面试题

💛 前情提要💛 本章节是C的类和对象- 封装的相关知识~ 接下来我们即将进入一个全新的空间,对代码有一个全新的视角~ 以下的内容一定会让你对C有一个颠覆性的认识哦!!! 以下内容干货满满,跟上…

【自然语言处理(NLP)】基于ERNIE语言模型的文本语义匹配

【自然语言处理(NLP)】基于ERNIE语言模型的文本语义匹配 作者简介:在校大学生一枚,华为云享专家,阿里云星级博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全…

GD32单片机使用Jlink在SWD无法下载和仿真

1. SWD引脚锁解方法1 https://developer.arm.com/documentation/101455/0100/Setup-ULINK2/Configure-uVision-for-Debugging/Cortex-M-Debugging/Debug-Driver-Configuration/Debug 拉低RST引脚,修改SW速率,即使用在MCU复位状态下,通过SWD…

江西涉农县开展一对一指导服务 国稻种芯:重点保障水稻生长

江西涉农县开展一对一指导服务 国稻种芯:重点保障水稻生长 时代周报 王晨婷 邓宇晨 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 国稻种芯中国水稻网 中国三农智库网-功能性农业农业大健康大会报道 万赢信采编:8月27日,接连几周高温之…

计算机毕业设计django基于python鲜花培育专家系统 (源码+系统+mysql数据库+Lw文档)

项目介绍 在各学校的教学过程中,鲜花培育专家管理是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的可以鲜花培育专家技术学习的平台&#xf…

14天刷爆LeetCode算法学习计划——Day04 双指针(2)

Day04——双指针一、前言二、知识点三、LeetCode557. 反转字符串中的单词 III1.题目2.解题思路3.注意事项4.代码实现5.验证代码6.其它解法(来自力扣)1️⃣使用额外空间2️⃣借助StringBulider四、结语一、前言 盲目刷题只会让自己心态爆炸,所…

WiFi信号感知精度

WiFi信号感知极限: 对5GHz的WiFi,其波长λ\lambdaλ在5.7厘米左右,根据上图理论模型,当目标的位移导致的反射路径长度变化超过5.7厘米时,动态向量可以旋转超过一周,产生一个完整的正弦信号;当发…

弱口令(Weak Password)总结和爆破工具

文章目录弱口令定义弱口令字典通过社工定制字典库弱口令字典爆破工具超级弱口令检查工具水影-域信息收集WebCrackBurpSuite的intruder模块hydra弱口令定义 网站管理、运营人员由于安全意识不足,为了方便、避免忘记密码等,使用了非常容易记住的密码&…

Windows 硬盘分区整数大小计算

在线计算器参考 硬盘整数分区计算器在线工具 (NTFS/FAT32) Excel计算公式:

SpringBoot - 配置文件application.yml使用详解

什么是YAML SpringBoot - YAML使用详解 写在前面 (1)YAML 是 JSON 的超集,简洁而强大,专门用来书写配置文件的语言,可以替代 *.properties。 (2)在创建SpringBoot框架的项目时,引…

基于STM32和LD3320的智能语音识别柔光台灯设计

目录标题基于STM32智能语音识别柔光台灯设计设计说明原理图系统各模块器件介绍LD3320语音识别模块OLED显示模块PCB图源程序程序设计框架程序流程图主函数OLED程序设计说明书立论依据文献综述研究内容研究基础毕业设计: 基于STM32智能语音识别柔光台灯设计 &#x…