【lesson29】MySQL事务不同隔离级别之间的区别演示

文章目录

  • 读未提交
  • 读提交
  • 可重复读
  • 串行化
  • 总结

读未提交

在这里插入图片描述
我们看到这时的隔离级别是读提交,那么我们就要把隔离级别改为,读未提交。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以看到两个终端的mysql隔离级别已经都被改成了读未提交。

开始演示读未提交:
开启2个事务在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
事务2读取到了事务1还未提交的数据,这就是读未提交。
在这里插入图片描述

一个事务能读到另一个事务还未提交的数据这叫脏读。

读提交

在这里插入图片描述
我们现在的隔离级别是读未提交,那么我们把它更改为读提交
在这里插入图片描述
在这里插入图片描述
重启mysql客户端后我们就会看到,隔离级别修改成功。

开始演示读提交:
开启2个事务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
1个事务结束提交了,另一个事务就能看到该已经结束事务修改的数据,如果该事务未结束就看不到叫做读提交。

所以在事务1提交之前,事务2的数据不是最新的。

在多个事务并发运行时,任何一个有读取条件的事务,它极有可能在其它事务未提交修改数据时看不到修改的数据,提交了自己未结束就可以看到修改的数据,就会导致同一个事务内部两次select可能看到的结果不一样。这种现象叫不可重复读。

那么不可重复读是问题吗?
举例子:
今年到年底了,老板准备给不同工资的员工发送不同的礼品。
老板把这个任务交代给了总经理。
于是总经理就计划出了下列的方案。
[1000,2000) 送水杯
[2000,3000) 送键盘
[3000,4000) 送微波炉
[4000,5000) 送电视
[5000,10000) 送手机
然后总经理让程序员小张,根据方案找出各个工资对应的人员。

于是小张就启动了一个事务
beigin;
select name from emp where
sal >=1000 and sal < 2000;
2000 3000
3000 4000
4000 5000
5000 10000
commit;

但是在小张运行事务的同时。
Tom觉得自己工资很低就3000块,但是自己对公司的贡献很大,于是Tom找到老板让老板给自己涨工资,老板一看确实Tom贡献很大,于是就让小王把Tom的工资涨到4500

于是小张就启动了一个事务。
begin;
update emp set sal = 4500 where name = ‘Tom’;
commit;

但是这时候可能就遇到一个情况:小张,小王的事务同时在运行。
小王还没改完,小张在3000-4000工资处查到了Tom。
小王改完了,小张刚好又在4000-5000工资处查到了Tom。
所以这里就出现了问题,小张可能会疑惑,Tom的工资怎么既在3000-4000,又在4000-5000呢?

所以不可重复读是问题。

可重复读

在这里插入图片描述
我们初始的隔离级别是读提交,那么接下来我们要把它改成可重复读。
在这里插入图片描述
重启mysql客户端
在这里插入图片描述
我们看到修改成功了。

开始演示可重复读:
开启2个事务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重启一个事务
在这里插入图片描述
我们发现,确实在事务重启后就能看见修改的数据内容。

再次演示可重复读:
开启事务

事务2原始数据:
在这里插入图片描述
事务1修改数据:
在这里插入图片描述
事务2查看数据:
在这里插入图片描述
结束事务2
重启一个事务
在这里插入图片描述

多次查看,发现终端A在对应事务中insert的数据,在终端B的事务周期中,也没有什么影响,也符合可重复的特点。但是,一般的数据库在可重复读情况的时候,无法屏蔽其他事务insert的数据(为什么?因为隔离性实现是对数据加锁完成的,而insert待插入的数据因为并不存在,那么一般加锁无法屏蔽这类问题),会造成虽然大部分内容是可重复读的,但是insert的数据在可重复读情况被读取出来,导致多次查找时,会多查找出来新的记录,就如同产生了幻觉。这种现象,叫做幻读(phantom read)。很明显,MySQL在RR级别的时候,是解决了幻读问题的(解决的方式是用Next-Key锁(GAP+行锁)解决的。这块比较难,有兴趣同学了解一下)

串行化

在这里插入图片描述
我们看到初始隔离级别是可重复读,那么把它改成串行化
在这里插入图片描述
在这里插入图片描述
修改成功!

演示串行化:
开启2个事务
在这里插入图片描述

事务1和事务2查看数据
在这里插入图片描述
事务1:删除数据
在这里插入图片描述
我们发现卡在这里
在这里插入图片描述
但是事务2还可以查数据。

在这里插入图片描述
最后我们发现事务1删数据超时了。
在这里插入图片描述

这时我们把事务2结束掉;
在这里插入图片描述
然后事务1再删除数据
在这里插入图片描述
我们这时就会发现,当只有事务1在运行的时候,对数据修改才会成功。

对所有操作全部加锁,进行串行化,不会有问题,但是只要串行化,效率很低,几乎完全不会被采用

总结

  • 其中隔离级别越严格,安全性越高,但数据库的并发性能也就越低,往往需要在两者之间找一个平衡点。
  • 不可重复读的重点是修改和删除:同样的条件, 你读取过的数据,再次读取出来发现值不一样了 。幻读的重点在于新增:同样的条件,第1次和第2次读出来的记录数不一样
  • 说明: mysql 默认的隔离级别是可重复读,一般情况下不要修改
  • 上面的例子可以看出,事务也有长短事务这样的概念。事务间互相影响,指的是事务在并行执行的时候,即都没有commit的时候,影响会比较大。
    在这里插入图片描述

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

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

相关文章

【C++】STL之空间配置器(了解)

一、什么是空间配置器 空间配置器 &#xff0c;顾名思义就是为各个容器高效的管理空间&#xff08;空间的申请与回收&#xff09;的&#xff0c;在默默地工作。虽然在常规使用 STL 时&#xff0c;可能用不到它&#xff0c;但站在学习研究的角度&#xff0c;学习它的实现原理对…

[BUUCTF]-PWN:cmcc_pwnme2解析

保护 ida 完整exp&#xff1a; from pwn import* context(log_leveldebug) #premote(node5.buuoj.cn,26964) pprocess(./pwnme2) addhome0x8048644 addflag0x8048682 getfile0x80485CB main0x80486F8 pop_ebp0x8048680 ret0x80483f2 pop_ebx0x8048409 pop_edi_ebp0x804867f st…

QT自制软键盘 最完美、最简单、支持中文输入(二)

目录 一、前言 二、本自制虚拟键盘特点 三、中文输入原理 四、组合键输入 五、键盘事件模拟 六、界面 七、代码 7.1 frmKeyBoard 头文件代码 7.2 frmKeyBoard 源文件代码 八、使用示例 九、效果 十、结语 一、前言 由于系统自带虚拟键盘不一定好用&#xff0c;也不一…

大学生以C语言为开始怎样学好编程呢?

大学生以C语言为开始怎样学好编程呢&#xff1f; 在开始前我分享下我的经历&#xff0c;刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;两年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些C语言学习方法和资料&#xff0c;让我不断提升自己&#xff0c;…

【Node.js基础】Node.js的介绍与安装

文章目录 前言一、什么是Node.js&#xff1f;二、安装Node.js2.1 Windows系统2.2 macOS系统2.3 Linux系统 三、运行js代码总结 前言 随着互联网技术的不断发展&#xff0c;构建高性能、实时应用的需求日益增长。Node.js作为一种服务器端运行时环境&#xff0c;以其事件驱动、非…

2024新鲜出炉 Java集合常见面试题总结(下)

2024新鲜出炉 Java集合常见面试题总结(下) 文章目录 2024新鲜出炉 Java集合常见面试题总结(下)Map&#xff08;重要&#xff09;HashMap 和 Hashtable 的区别HashMap 和 HashSet 区别HashMap 和 TreeMap 区别HashSet 如何检查重复?HashMap 的底层实现JDK1.8 之前JDK1.8 之后 H…

java基于springboot的美妆化妆品商城购物网站ssm+vue

美妆购物网站分为管理员&#xff0c;商家&#xff0c;用户三种权限。 用户可以注册&#xff0c;可以登录&#xff0c;用户进入到首页可以看到热门化妆品和新品化妆品&#xff0c;可以选购化妆品&#xff08;可以通过搜索查询&#xff09;加入购物车&#xff0c;查看化妆品详细情…

(自用)learnOpenGL学习总结-高级OpenGL-抗锯齿

MSAA 光栅器会将一个图元的所有顶点作为输入&#xff0c;并将它转换为一系列的片段。顶点坐标理论上可以取任意值&#xff0c;但片段不行&#xff0c;因为它们受限于你窗口的分辨率。顶点坐标与片段之间几乎永远也不会有一对一的映射&#xff0c;所以光栅器必须以某种方式来决定…

github开源代码流程-初始化配置 quick start

开始前配置&#xff1a; 需要有一个github账号 需要安装git 一.配置github 登陆github 需要username&#xff08;这个后面会用到&#xff09;&#xff0c;password 1.配置pat密钥token 由于github已经移除了靠password进行验证的方式&#xff0c;所以必须进行个人令牌的设…

一键给家长私发成绩

各位老师&#xff0c;你们是否也有过这样的经历&#xff1a;每到考试后&#xff0c;为了将学生的成绩一一发给家长&#xff0c;费尽心思地整理、核对&#xff0c;甚至有时候还要加班。如今&#xff0c;有了易查分&#xff0c;这一切似乎变得轻松起来。但这个功能真的是老师们的…

2023 IoTDB Summit:Dr. Feinauer《Apache IoTDB在德国工业和关键基础设施中的应用》

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

Patch2QL:开源供应链漏洞挖掘和检测的新方向

背景 开源生态的上下游中&#xff0c;漏洞可能存在多种成因有渊源的其它缺陷&#xff0c;统称为“同源漏洞”&#xff0c;典型如&#xff1a; 上游代码复用缺陷。开源贡献者在实现功能相似的模块时&#xff0c;常复用已有模块代码或逻辑&#xff1b;当其中某个模块发现漏洞后…

成功解决Error:AttributeError: module ‘numpy‘ has no attribute ‘long‘.

成功解决Error&#xff1a;AttributeError: module ‘numpy‘ has no attribute ‘long‘. &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;报错分析&#x1f333;&#x1f333;解决方案1&#xff1a;降低NumPy版本&#x1f333;&#x1f333…

vue实现瀑布流

每个色块宽度一致&#xff0c;高度自适应 <!DOCTYPE html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"><meta name"renderer" content"we…

【Docker】了解Docker Desktop桌面应用程序,TA是如何管理和运行Docker容器(1)

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

EasyExcel导出Excel和多个图片到Zip,并实现超链接

前言&#xff1a;之前做了将图片直接插入到excel的需求&#xff0c;由于数据太多会导致导出慢或者直接报错&#xff0c;于是采用了将图片和excel分开放在一个zip压缩包中&#xff0c;并且&#xff0c;excel中对应图片的列点击后可以直接超链接到对应的图片。 实现效果&#xff…

东芝2323AMW数码复合机扫描文件至U盘无法选择JPEG问题解决方法

东芝eSTUDIO2323AMW数码复合机扫描文件至U盘无法选择JPEG问题解决方法 问题描述&#xff1a; 东芝eSTUDIO2323AMW数码复合机扫描文件至U盘只能输出PDF文件格式&#xff0c;而下方的JPEG是灰色的无法选择&#xff1b; 解决方法&#xff1a; 将模式选择为“彩色模式”之后“JPEG”…

【c语言】简单贪吃蛇的实现

目录 一、游戏说明 ​编辑 二、地图坐标​ ​编辑 三、头文件 四、蛇身和食物​ 五、数据结构设计​ 蛇节点结构如下&#xff1a; 封装一个Snake的结构来维护整条贪吃蛇&#xff1a;​ 蛇的方向&#xff0c;可以一一列举&#xff0c;使用枚举&#xff1a; 游戏状态&a…

利用操作符解题的精彩瞬间

下面是链接为了解释练习2的并且还有与操作符相关的知识。 C语言与操作符相关的经典例题-CSDN博客 操作符详解&#xff08;上&#xff09;-CSDN博客 操作符详解&#xff08;下&#xff09;-CSDN博客 目录 练习1&#xff1a;在一个整型数组中&#xff0c;只有一个数字出现一…

多源BFS

AcWing 173. 矩阵距离 #include <bits/stdc.h> using namespace std;const int N 1010; char g[N][N]; int n, m; typedef pair<int, int> PII; int d[N][N]; bool st[N][N];int dx[] {0, 0, 1, -1}; int dy[] {1, -1, 0, 0};void bfs() {queue<PII> q;me…