【MySQL】并发执行事务可能存在的问题, 事物的四种隔离级别

news2024/11/25 10:26:50

文章目录

  • 前言
  • 一、并发执行事务可能存在的问题
    • 1, 脏读问题
    • 2, 不可重复读
    • 3, 幻读
  • 二、MySQL 的四种隔离级别
    • 1, READ UNCOMMITTED 读未提交
    • 2, READ COMMITTED 读已提交
    • 3, REPEATABLE READ 可重复读 (MySQL 的默认事务隔离级别)
    • 4, SERIALIZABLE 串行化
  • 总结


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

在这里插入图片描述

面试中问到 MySQL , 一定会问的就是并发执行事务可能存在的问题, 事物的四种隔离级别相关的问题, 所以这些知识非常重要 ! !


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

一、并发执行事务可能存在的问题

接下来先用通俗的语言, 解释一下这些 “专业术语” 的意思, 然后再 “专业性” 的总结

1, 脏读问题

场景 :

  • 比如我在宿舍库库敲代码, 我的室友要抄我的代码, 过来看了一眼就走了

  • 他走之后, 我把代码修改了

  • 过了一会他又来了, 看到了我的代码已经修改了, 或者是删了

当 事务A 对某个数据修改的过程中, 事务A 未提交之前, 事务B 来读这个数据, 这个过程就是脏读, 读到的数据就是脏数据,

脏数据是指 : 无效的数据 (因为 事务A 还未提交, 可能 事务B 读完之后, 事务A 又修改了, 事务B 再读的时候就可能和上次读到的不一样 )

解决方案 :

  • 给我 “写代码的操作” 加锁, 我写完了, 别人才能看

后果 :

  • 给 “写操作” 加锁之后, “读” 和 “写” 不能并发执行, 降低了并发执行效率, 但提升了隔离性

2, 不可重复读

场景 :

  • (事先约定 : 我写完了, 室友才能看) 我把代码写完了, 对室友说: “你过来看吧”

  • 他看了一眼, 回去自己写了

  • 有一只鸡来到我的键盘上一顿乱啄, 代码被改了

  • 室友再来看的时候发现, 代码变了

事务A 提交之后, 事务B 来读这个数据, 但有可能读到 其他事务 提交的数据, 导致多次读取到的数据不一样, 这个过程就是不可重复读

解决方案 :

  • 刚才 : 给我 “写代码的操作” 加锁, 我写完了, 别人才能看
  • 现在 : 给室友 “读代码的操作” 加锁, 他读的时候, 谁也不能改数据

后果 :

  • 给 “写操作” 加锁之后, 又给 “读操作” 加锁, 进一步 降低了并发执行效率, 但提升了隔离性

3, 幻读

场景 :

  • (事先约定 : 我写完了, 室友才能看, 他看的时候, 谁也不能改) 我写好了代码, 对室友说: “你过来看吧”

  • 他看了一眼, 回去自己写了

  • 我没闲着, 他要看的代码我不碰, 我打算写其他的代码

  • 他再抬头看的时候, 发现 : “卧槽, 你背着我卷?”

事务A 提交之后, 事务B 来读这个数据, 下次再读的时候, 读到的结果没变, 但是结果集变了, 这个过程就是幻读

解决方案 :

  • 第一步 : 给我 “写代码的操作” 加锁, 我写完了, 别人才能看
  • 第二步 : 给室友 “读代码的操作” 加锁, 他读的时候, 谁也不能改数据
  • 第三步 : 必须等他告诉我 “抄完了” , 我才能碰电脑(完全串行化)

后果 :

  • 我确定写完了, 室友才能看, 室友确定看完了, 我才能继续写, 完全拒绝并发, 但隔离性达到巅峰

二、MySQL 的四种隔离级别

设置不同的事务隔离级别能够不同程度地解决脏读, 不可重复读, 幻读问题

脏读不可重复读幻读
READ UNCOMMITTED 读未提交
READ COMMITTED 读已提交
REPEATABLE READ 可重复读
SERIALIZABLE 串行化

1, READ UNCOMMITTED 读未提交

如果隔离级别设置为 “读未提交” , 那么该隔离级别的事务可以看到其他事务中未提交的数据。

该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读

该隔离级别下存在 : 脏读, 不可重复读, 幻读问题


2, READ COMMITTED 读已提交

如果隔离级别设置为 “读已提交”, 那么该隔离级别的事务能读取到已经提交事务的数据,因此它可以解决脏读问题

但由于在事务的执行中还可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读

该隔离级别下存在 : 不可重复读, 幻读问题


3, REPEATABLE READ 可重复读 (MySQL 的默认事务隔离级别)

如果隔离级别设置为 “可重复读”,那么它能确保同⼀事务多次查询的结果⼀致。因此它可以解决不可重复读问题

但也会有新的问题,比如此级别的事务正在执行时,另⼀个事务成功的插入了某条数据,但因为它每次查询的结果都是⼀样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息,但就是插入不进去,这就叫幻读

该隔离级别下 : 存在幻读问题


4, SERIALIZABLE 串行化

如果隔离级别设置为 “串行化”, 那么它会强制事务排序,多个事务不会并发,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多


总结

以上就是本篇的全部内容, 主要介绍了并发执行事务事存在的幻读, 不可重复读, 幻读问题, 以及四种隔离级别下能够不同程度的解决这些问题

脏读不可重复读幻读
READ UNCOMMITTED 读未提交
READ COMMITTED 读已提交
REPEATABLE READ 可重复读
SERIALIZABLE 串行化

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

在这里插入图片描述

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

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

相关文章

百度智能云“千帆大模型平台”升级,大模型最多,Prompt模板最全

1、前言 从ChatGPT正式推出之后,大模型开始逐渐火爆起来,基于大模型的潜力与广泛应用前景,多个厂商也开始在大模型领域进行深耕布局。越来越多的人也开始尝试使用大模型来解决日常工作或生活中的问题,有效地提高了处理问题的效率。…

探讨uniapp的生命周期问题

在uniapp中,生命周期函数分为应用生命周期函数、页面生命周期函数和组件生命周期函数. 1应用声明周期 应用生命周期函数只能在 App.vue 中监听有效,在其他页监听无效。 onLaunch:当uni-app 初始化完成时触发(全局只触发一次)on…

【变形金刚03】使用 Pytorch 开始构建transformer

一、说明 在本教程中,我们将使用 PyTorch 从头开始构建一个基本的转换器模型。Vaswani等人在论文“注意力是你所需要的一切”中引入的Transformer模型是一种深度学习架构,专为序列到序列任务而设计,例如机器翻译和文本摘要。它基于自我注意机…

【传输层】Tcp协议的原理(二)

文章目录 一、TCP协议原理(二)总结 一、TCP协议原理(二) 1.解决TIME_WAIT状态引起的bind失败的方法 我们之前实现tcp服务器的时候发现,服务器经常有时候断开可以立即重启,有时候断开必须换端口号才能重新…

qt事件系统源码-----定时器

qt定时器的使用一般有以下几种方式: 1、直接使用QTimer对象,绑定定时器的timeout信号; 2、使用QTimer的静态方法singleshot方法,产生一个一次性的定时事件 3、在QObject子类中,调用startTimer方法,产生定…

Vue.js从入门到精通:软件开发视频大讲堂

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 前言 随着Web应用程序的…

nodejs+vue+elementui+express旅游出行指南网站_655ms

本文主要介绍了一种基于windows平台实现的旅游出行指南。该系统为用户找到景点信息和酒店信息提供了更安全、更高效、更便捷的途径。本系统有两个角色:管理员和用户,要求具备以下功能: (1)用户可以浏览主页了解旅游出行…

2023牛客暑期多校训练营8-C Clamped Sequence II

2023牛客暑期多校训练营8-C Clamped Sequence II https://ac.nowcoder.com/acm/contest/57362/C 文章目录 2023牛客暑期多校训练营8-C Clamped Sequence II题意解题思路代码 题意 解题思路 先考虑不加紧密度的情况,要支持单点修改,整体查询&#xff0…

阿里云服务器安装AMH面板建站教程

本文阿里云百科分享使用阿里云服务器安装AMH面板建站教程,AMH是一套通过Web控制和管理Linux服务器以及虚拟主机的管理系统。您可以使用云服务器ECS安装AMH来搭建PHP网站。本篇教程分别介绍如何在Linux系统实例中部署AMH并快速搭建PHP网站。 目录 前提条件 手动部…

Electron 应用实现截图并编辑功能

Electron 应用实现截图并编辑功能 Electron 应用如何实现截屏功能,有两种思路,作为一个框架是否可以通过框架实现截屏,另一种就是 javaScript 结合 html 中画布功能实现截屏。 在初步思考之后,本文优先探索使用 Electron 实现截屏…

CCF-CSP 29次 第三题【202303-3 LDAP】(多个STL+递归)

计算机软件能力认证考试系统 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <unordered_map> #include <string>using namespace std;typedef long long LL;const int N 2510, M 510;int n…

Qt应用开发(基础篇)——拆分器窗口 QSplitter QSplitterHandle

一、前言 QSplitter继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是Qt的一个部件容器工具类。 框架类QFrame介绍 QSplitter拆分器&#xff0c;用户通过拖动子部件之间的边界来控制子部件的大小&#xff0c;在应用开发中数据分模块展示、图片展示等场景下使用。 二、…

Nuxt.js--》解锁 Nuxt 项目的潜力:从配置开始,迈向成功

博主今天开设Nuxt.js专栏&#xff0c;带您深入探索 Nuxt.js 的精髓&#xff0c;学习如何利用其强大功能构建出色的前端应用程序。我们将探讨其核心特点、灵活的路由系统、优化技巧以及常见问题的解决方案。无论您是想了解 Nuxt.js 的基础知识&#xff0c;还是希望掌握进阶技巧&…

FastDFS安装教程

FastDFS安装 软件下载 需要的软件&#xff1a;fastdfs-6.0.4、libfastcommon-1.0.42、fastdfs-nginx-module-1.22.tar.gz 下载地址 安装 fastdfs是使用c语言写的&#xff0c;需要先配置c语言环境。 yum install -y gcc gcc-cyum install libevent安装libfastcommon函数库…

Leetcode-每日一题【剑指 Offer 20. 表示数值的字符串】

题目 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 若干空格一个 小数 或者 整数&#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数若干空…

Win7累积补丁更新包_UpdatePack7R2-23.8.10

UpdatePack7是最新的Win7补丁累积更新包&#xff0c;Windows 7更新补丁安装包&#xff0c;Win7累积更新离线安装包包括所有关键更新和安全更新及Internet Explorer所有版本的更新&#xff0c;此外还集成了NVMe驱动和USB3.0驱动&#xff0c;使用它还可以将累积更新封装到系统内&…

通过BitMap实现签到

针对黑马点评。 bitmap签到 在传统的签到系统中的数据库的表一般都采取直接存储的形式&#xff0c;类似于一种记录表&#xff0c;但是如果用户的数量特别大&#xff0c;签到上几个月之后&#xff0c;这种表的数据量特别大&#xff0c;同时&#xff0c;存储的数据也会占用很多…

大汇总!各省杰青优青名单已出炉

【SciencePub学术】杰青&#xff0c;是国家杰出青年基金项目资助获得者的简称&#xff0c;与科技奖励计划类似&#xff0c;是我国重要的人才计划之一。一所学校的杰青数量&#xff0c;代表学校未来的学术发展潜力和在同类高校的学术地位&#xff0c;每所大学都非常看重。今年部…

Lombok的使用及注解含义

文章目录 一、简介二、如何使用2.1、在IDEA中安装Lombok插件2.2、添加maven依赖 三、常用注解3.1、Getter / Setter3.2、ToString3.3、NoArgsConstructor / AllArgsConstructor3.4、EqualsAndHashCode3.5、Data3.6、Value3.7、Accessors3.7.1、Accessors(chain true)3.7.2、Ac…

C++笔记之if(指针)的含义

C笔记之if(指针)的含义 code review! 文章目录 C笔记之if(指针)的含义例1例2 例1 例2