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

文章目录

  • 前言
  • 一、并发执行事务可能存在的问题
    • 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.rhkb.cn/news/88559.html

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

相关文章

web会话跟踪以及JWT响应拦截机制

目录 JWT 会话跟踪 token 响应拦截器 http是无状态的,登录成功后,客户端就与服务器断开连接,之后再向后端发送请求时,后端需要知道前端是哪个用户在进行操作。 JWT Json web token (JWT), 是为了在网络应用环境间传递声明而…

WebAPIs 第三天

DOM 事件进阶 事件流事件委托其他事件元素尺寸与位置 一.事件流 事件流与两个阶段说明事件捕获事件冒泡阻止冒泡解绑事件 1.1 事件流与两个阶段说明 ① 事件流:指的是事件完整执行过程中的流动路径 ② 事件流分为捕获阶段和冒泡阶段 1.2 事件捕获 从DOM根元素…

探讨uniapp的生命周期问题

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

AI 绘画Stable Diffusion 研究(七) 一文读懂 Stable Diffusion 工作原理

大家好,我是风雨无阻。 本文适合人群: 想要了解AI绘图基本原理的朋友。 对Stable Diffusion AI绘图感兴趣的朋友。 本期内容: Stable Diffusion 能做什么 什么是扩散模型 扩散模型实现原理 Stable Diffusion 潜扩散模型 Stable Diffu…

VMware Workstation中安装了Windows7系统但是VMware Tools选项为灰色及无法安装的解决方法

一、问题描述 当我们在使用VMware Workstation安装好了Windows7系统后;该安装好的Windows7系统并不能自动适配WMware的界面,只能在中间显示很小的一部分内容;此时我们就需要给Windows7系统安装VMware Tools工具; 问题一:WMware中的【安装VMware Tools】选项则是灰色的无法…

邻接表创建无向表(C++ 代码)

#include<iostream>//邻接表创建无向表 #define MVNum 100 using namespace std; typedef char VerTexType; typedef struct Arcnode//边节点 {int adjvex;//该边所指向的顶点的位置struct Arcnode* nextarc;//指向下一条边的指针 }Arcnode; typedef struct vnode//顶点节…

【瑞吉外卖】Linux学习

Linux常用命令 Linux命令初体验 Linux的命令都是由一个或几个单词的缩写构成的 命令对应英文作用lslist查看当前目录下的内容pwdprint work directory查看当前所在目录cd [目录名]change directory切换目录touch [文件名]touch如果文件不存在&#xff0c;新建文件mkdir [目录…

软件测试基础篇——LAMP环境搭建

LAMP 1、Linux系统的其他命令 find命令&#xff1a;在目录下查找文件 ​ 格式一&#xff1a;find 路径 参数 文件名 ​ 路径&#xff1a;如果没有指定路径&#xff0c;默认是在当前目录下 ​ 参数&#xff1a;-name 根据文件名来查找&#xff0c;区分大小写&#xff1b; -…

【多模态】25、ViLT | 轻量级多模态预训练模型(ICML2021)

文章目录 一、背景二、ViLT 方法三、效果3.1 数据集3.2 分类任务 VQA 和 NLVR23.3 Image Retrieval 论文&#xff1a;ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision 代码&#xff1a;https://github.com/dandelin/vilt 出处&#xff1a;…

JVM相关知识

文章目录 JMM主内存与工作内存工作内存与主内存的交互的8种方法JVM内存结构运行时数据区 类加载机制类加载器类加载分类获取类加载器的途径双亲委派机制双亲委派的机制的弊端是什么?怎么打破双亲委派机制代码热替换、模块热部署自定义类加载器对类加载器的引用 String底层stri…

sentinel核心流程源码解析

sentinel的处理槽(ProcessorSlot) 可以说&#xff0c;sentinel实现的各种功能就是由各处理槽完成的 ,ProcessorSlot定义了四个方法&#xff1a; 当进入该处理槽时触发该方法 处理完 entry方法之后触发该方法 退出该处理槽时触发该方法 exit方法处理完成时触发该方法 sentinel的…

枚举缓存工具

此文章为笔记&#xff0c;为阅读其他文章的感受、补充、记录、练习、汇总&#xff0c;非原创&#xff0c;感谢每个知识分享者。 文章目录 1. 背景2. 枚举缓存3. 样例展示4. 性能对比5. 总结 本文通过几种样例展示如何高效优雅的使用java枚举消除冗余代码。 1. 背景 枚举在系统…

一文读懂HTML

文章目录 HTML的历史HTML的作用HTML的基本语言 HTML的历史 HTML&#xff08;HyperText Markup Language&#xff09;的历史可以追溯到20世纪90年代早期&#xff0c;它是互联网发展的重要里程碑之一。以下是HTML的历史概述&#xff1a; 早期阶段&#xff08;1980年代末 - 1990年…

创新引领城市进化:人工智能和大数据塑造智慧城市新面貌

人工智能和大数据等前沿技术正以惊人的速度融入智慧城市的方方面面&#xff0c;为城市的发展注入了强大的智慧和活力。这些技术的应用不仅令城市管理更高效、居民生活更便捷&#xff0c;还为可持续发展和创新奠定了坚实的基础。 在智慧城市中&#xff0c;人工智能技术正成为城市…

Unity使用C# Protobuf源码

目录 第一步&#xff1a;下载源码 第二步&#xff1a;运行C#构建文件 第三步&#xff1a;处理报错&#xff08;如果你已安装对应的SDK则不会报错&#xff09; 第四步&#xff1a;复制库文件到你的工程 第一步&#xff1a;下载源码 protobuf github源码https://github.com/p…

《甲午》观后感——GPT-3.5所写

《甲午》是一部令人深思的纪录片&#xff0c;通过生动的画面和真实的故事&#xff0c;向观众展示了中国历史上的一段重要时期。观看这部纪录片&#xff0c;我深受触动&#xff0c;对历史的认识也得到了深化。 首先&#xff0c;这部纪录片通过精心搜集的历史资料和珍贵的影像资料…

Xamarin.Android实现手写板的功能

目录 1、背景说明2、实现效果3、代码实现3.1 整体思路3.2 核心绘画类-PaintView.cs3.3 对话框类-WritePadDialog.cs3.4 前端实现类-MainActivity3.5 布局文件3.5.1 write_pad.xml3.5.2 activity_main布局文件 4、知识总结5、代码下载6、参考资料 1、背景说明 在实际使用过程中…

vector的模拟实现

什么是vector vector是一个封装了动态大小数组的顺序容器跟任意其它类型容器一样&#xff0c;它能够存放各种类型的对象。 模拟实现 实现前的准备 在实现vector之前&#xff0c;为了和库里的区分开需要将实现的vector放在一个自定义的命名空间里。而且vector需要实现成模版…

ITIL4—度量和报告实践

1. 关于本文 本文为度量和报告实践提供了实用指南&#xff0c;分为五个主要部分&#xff0c;涵盖&#xff1a; 本实践的基本信息本实践相关的流程和活动&#xff0c;及其在服务价值链中的作用参与本实践的组织和人员支持本实践的信息和技术合作伙伴和供应商在本实践中的注意事…

P1123 取数游戏

取数游戏 题目描述 一个 N M N\times M NM 的由非负整数构成的数字矩阵&#xff0c;你需要在其中取出若干个数字&#xff0c;使得取出的任意两个数字不相邻&#xff08;若一个数字在另外一个数字相邻 8 8 8 个格子中的一个即认为这两个数字相邻&#xff09;&#xff0c;求…