【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.mzph.cn/news/33362.shtml

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

相关文章

idea如何上传项目到github(超详细)

idea如何上传项目到github 1、IDEA配置2、项目上传到本地仓库2.1、创建本地git仓库2.2、Add操作2.3、Commit操作 3、项目上传到Github4、拿到登录Github的token 1、IDEA配置 File-Settings-VersionControl-Git Git的安装路径下bin目录下的git.exe可执行文件 可以直接点 Gene…

QGIS3.28的二次开发六:VS不借助QT插件创建UI界面

上一篇博客我们说了在VS中如何使用QT插件来创建UI界面,但是我们二次开发QGIS的第一篇博客就说了,最好使用OSGeo4W中自动下载的QT进行QGIS二次开发,这样兼容性是最好的,那么该如何在VS中不使用外部安装的QT以及QT的VS插件情况下进行…

【vue3】vue3中父子组件传参:

文章目录 一、父传子:二、父调用子方法:三、子组件发送emit方法给父组件: 一、父传子: 【1】父组件传值: 【2】子组件接收: 二、父调用子方法: 【1】父组件调用: 【2】子组件暴…

RabbitMQ在CentOS下的安装

RabbitMQ的版本是3.8.2 1.环境配置:CentOs 7.6以上版本,我的版本是7.9,不要对yum换源,否则可能会安装失败。 echo "export LC_ALLen_US.UTF-8" >> /etc/profile source /etc/profile 以上命令,是…

vue使用ElementUI

1.安装 npm i element-ui -S 2.引入 2.1完整引入 import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;Vue.use(ElementUI); 2.2按需引入 说明:为了输入时候有提示,建…

变形金刚在图像识别方面比CNN更好吗?

链接到文 — https://arxiv.org/pdf/2010.11929.pdf 一、说明 如今,在自然语言处理(NLP)任务中,转换器已成为goto架构(例如BERT,GPT-3等)。另一方面,变压器在计算机视觉任务中的使用…

Practices9(双指针)|283. 移动零、11. 盛最多水的容器、15. 三数之和

283. 移动零 1.题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,…

第二十三章 原理篇:Pix2Seq

大夏天我好像二阳了真是要命啊。 现在找到工作了,感觉很快乐,但是也有了压力。 《论你靠吹牛混进公司后该怎么熬过试用期》 希望自己能保持学习的习惯!加油! 参考教程: https://arxiv.org/pdf/2109.10852.pdf https://…

高级进阶多线程——多任务处理、线程状态(生命周期)、三种创建多线程的方式

Java多线程 Java中的多线程是一个同时执行多个线程的进程。线程是一个轻量级的子进程,是最小的处理单元。多进程和多线程都用于实现多任务处理。 但是,一般使用多线程而不是多进程,这是因为线程使用共享内存区域。它们不分配单独的内存区域…

Nginx负载均衡以及keepalived高可用实验

Vip 10.1.122 Keepalived-master 10.1.1.132Keepalied-backup 10.1.1.133Realserver_1 10.1.1.136Realserver_2 10.1.1.137 四台机器上安装nginx,编译安装的话需要另外安装pcre包支持,安装在/usr/local/nginx Keepalived-master 和backu…

【网络编程·网络层】IP协议

目录 一、IP协议的概念 二、IP协议的报头 1、四位首部长度 2、16位总长度(解包) 3、8位协议(分用) 4、16位首部校验和 5、8位生存时间 6、32位源IP和32位目的IP 7、4位版本/8位服务类型 8、16位标识 9、3位标志 10、1…

基于kettle实现pg数据定时转存mongodb

mogodb 待创建 基于kettle实现pg数据定时转存mongodb_kettle 实时迁移 mongodb_呆呆的私房菜的博客-CSDN博客

git一次错误merge的回滚

场景:提交到sit的代码,结果解决冲突merge了DEV的代码,所以要回滚到合并之前的代码 (原因是我再网页上处理了冲突,他就自动merge了,如图—所以还是idea处理冲突,可控) 方式二: &…

✅最新!自然指数中国科研机构百强名单,出炉!

【SciencePub学术】8 月 9 日,自然指数官网发布了最新的中国科研机构百强名单。名单根据各大机构2022年在自然科学领域的论文贡献份额进行排名。 其中,中国科学院以2053.76的论文贡献份额,位列榜首;中国科学院大学和中国科学技术…

PAT1044 Shopping in Mars

个人学习记录,代码难免不尽人意。 做了这么多题难得本题不看答案一遍过,很是激动。 Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diamond has a value (in Mars dollars M$). When making the pa…

06-2_Qt 5.9 C++开发指南_自定义对话框及其调用

本篇介绍到的对话框及其调用实例较为复杂但十分详细,如果做了解可以先参考:QT从入门到实战x篇_13_模态和非模态对话框创建。 文章目录 1. 对话框的不同调用方式2. 对话框QWDialogSize 的创建和使用2.1 创建对话框QWDialogSize2.2 对话框的调用和返回值 …

css内容达到最底部但滚动条没有滚动到底部

也是犯了一个傻狗一样的错误 ,滚动条样式是直接复制的蓝湖的代码,有个高度,然后就出现了这样的bug 看了好久一直以为是布局或者overflow的问题,最后发现是因为我给这个滚动条加了个高度,我也是傻狗一样的,…

Mongodb:业务应用(2)

需求: 1、获取保存到mongodb库中的搜索记录列表 2、实现删除搜索记录接口 保存搜索记录数据参考上篇Mongodb:业务应用(1)_Success___的博客-CSDN博客 获取记录列表 1、创建controller package com.heima.search.controller.v1;…

GD32F103硬件I2C0通讯

GD32F103的I2C模块有I2C0和I2C1;本程序使用I2C0功能模块; I2C0引脚复用和重映射: 当I2C0_REMAP0时,I2C0引脚复用功能,I2C0_SCL映射到PB6引脚,I2C0_SDA映射到PB7引脚; 当I2C0_REMAP1时,I2C0引脚重映射,I2C0_SCL映射到PB8引脚,I2C0_SDA映射到PB9引脚; I2C1引脚只有复用引脚: I2C…

学习笔记-JVM-对象结构及生命周期

申明:文章内容是本人学习极客时间课程所写,文字和图片基本来源于课程资料,在某些地方会插入一点自己的理解,未用于商业用途,侵删。 原资料地址:课程资料 对象的创建流程 常量池检查:检查new指令是否能在常…