轻松上手MYSQL:MYSQL事务隔离级别的奇幻之旅

​🌈 个人主页:danci_
🔥 系列专栏:《设计模式》《MYSQL》
💪🏻 制定明确可量化的目标,坚持默默的做事。


✨欢迎加入探索MYSQL索引数据结构之旅✨
    👋 大家好!文本学习研究事务隔离级别。👋 无论您是刚接触MySQL的初学者,还是希望深入优化性能的资深开发者,这篇文章都将为您揭开MySQL事务隔离级别的神秘面纱,让您掌握其中的奥秘,进而提升数据库操作的效率和精度。快来一起探索吧!


1. 什么是事务?


目录

一、事务隔离级别

1.1 事务并发执行的一致性问题

1.1.1 脏写

1.1.2 脏读

1.1.3 不可重复读:

1.1.4 幻读

1.2 SQL标准中的4种隔离级别

1.3 MYSQL查询事务隔离级别

1.4 MYSQL设置隔离级别

二、MYSQL4种隔离级别实战

2.1 READ UNCOMMITTED

2.2 READ COMMITTED

2.3 REPEATABLE READ(MYSQL默认的隔离级别)

2.4 SERIALIZABLE

三、总结


一、事务隔离级别

MYSQL是客户端 / 服务器的软件,是多对一的关系,即同时可以有多个客户端同时连一个接服务,每个客户端连接服务器后,就生成一个会话。每个会话都可以向服务器发送请求语句,一个请求语句可能是一个事务,也可能是一个事务的某一部分语句。而服务器可以同时处理来自多个客户端的请求语句。

事务简述:一个事务就对应着现实世界的一次状态转换。

下面举个例子,比如用户A向用户B转账100元,账户状态变更简化为以下几个步骤:

  1. 取出A账户余额a1。即一次select A
    1. a1 < 100,退出转账
    2. a1 >= 100,则继续
  2. a1 -= 100
  3. 更新入库。即一次update A
  4. 取出B账户余额b1。即一次select B
  5. b1 += 100
  6. 更新入库。即一次update B

在这个转账事务中,一定要保证 A减100 和 B加100 都成功,换句话说就是必须保证参与转账的账户的总余额保持不变,这也就是这个转账事务的一致性要求。

如果事务是以单个的形式一个接一个地执行,那么在一个事务开始时,面对的就是上一个事务执行结束后留下的一致性状态,它执行之后又会产生下一个一致性状态。那么在多个事务的情况下,情况就变得比较复杂。假如事务是交替执行的,如下图

如图中的交替执行的两个事务,A转账了两次5最后余额为6 ,B转入两次余额为12。显然A账户余额是错误的,这就违背了“参与转账的账户的总余额保持不变”的一致性要求。

这时就需要某种手段来强制让这些事务按照顺序一个一个单独地执行,或者最终执行的效果和单独执行一样。换句话说就是让多个事务隔离的执行,也就是互不干涉。这就是事务的隔离性要求。

如何实现事务的隔离性?

  • 串行执行:在系统中同一时刻最多只允许一个事务运行
    • 能保证一致性
    • 导致许多事务等待时间,资源利用率低
  • 可串行化执行:事务可并发执行,但涉及到同一个数据时,就等待其它事务提交之后才能继续访问这个数据。

可串行化执行对同一数据写操作就会出现等待,性能还是不高。在一些高并发场景中影响会非常明显。

1.1 事务并发执行的一致性问题

1.1.1 脏写

事务T1和事务T2同时修改数据x,事务T1开启事务写x值且还没有提交事务,事务T2开始写x值,这就发生了脏写。如下图:

脏写不只影响数据的一致性,还影响事务的原子性,如下图:(假设x初始值为 5)

事务 T1 因某种原因要回滚,那么需要将它的数据回滚到事务开启时的状态,也就是将x的值变为初始值为 5。但是对于事务 T2 来说,它修改x为200并且已经提交了,如果 T1 回滚,则 T2 事务的修改有一部分数据回滚了,这就影响了事务的原子性。

1.1.2 脏读

事务T1读到未提交事务T2修改过的数据,这就发生了脏读。如下图:

事务T1 读 x 时 T2 未提交,这时 T1 读到的是不一致的数据。

1.1.3 不可重复读:

事务 T1 修改了未提醒事务 T2 读取的数据,这就发生了不可重复读。如下图:

事务 T1 和事务 T2 都开启事务,事务 T2 读 x 为 50,之后事务 T1 修改 x = 100 并且提交了事务,事务 T2 再次读 x,此时 x 的值为 100了,这就出现在同一个事务中读同一条数据的值不一致问题。这种在同一个事务中读同一条数据不一致问题不应该暴露给用户的。

1.1.4 幻读

事务 T1 根据某种搜索条件井底出记录,在该事务未提交时,另一事务写入了符合那些搜索条件的记录,这就产生了幻读。如下图:

事务 T1 查询 col = 1 的数据有记录1 和 记录2,此时事务 T2 修改记录3 的col = 1并且提交事务,这时,事务 T1 再查询 col = 1 的数据有 记录1、记录2 和 记录3,与之前的查询结果不一致,不符合一致性要求。

影响一致性严重性大到小排序: 脏写 > 脏读 > 不可重复读 > 幻读

1.2 SQL标准中的4种隔离级别

  • READ UNCOMMITTED: 读未提交

  • READ COMMITTED: 读已提交

  • REPEATABLE READ: 可重复读

  • SERIALIZABLE: 可串行化

四种隔离级别在并发事务中可能发生的数据一致性问题如下:

也就是说:

  • READ UNCOMMITTED隔离级别下,可能脏读、不可重复读和幻读
  • READ COMMITTED隔离级别下,可能发生不要重复读和幻读
  • REPEATABLE READ隔离级别下,可能发生幻读
  • SERLIALIZABLE隔离级别下,脏读、不可重复读和 幻读 均不可能发生

注:脏写这个情况对一致性影响很严重,以上四种隔离级别都不准脏写发生。

1.3 MYSQL查询事务隔离级别

Mysql8以前:SELECT @@GLOBAL.tx_isolation, @@tx_isolation;Mysql8开始:SELECT @@GLOBAL.transaction_isolation, @@transaction_isolation;

1.4 MYSQL设置隔离级别

MYSQL支持4种事务隔离级别,默认的隔离级别为REPEATABLE READ(可重复读)

设置事务隔离级别

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level

其中

  • level有:REPEATABLE READ、READ UNCOMMITTED、READ COMMIITTED 和 SERIALIZABLE
  • GLOBAL| SESSION:可设置可不设置
    • 不设置:只对执行SET后的下一个事务有效
      • 对下一个事务有效
      • 对下下个事务无效,事务隔离级别恢复到之前的隔离级别
      • 在已经开启的事件中执行会报错
    • GLOBAL:全局范围有效
      • 当前会话无效
      • 只对执行完该SET后的会话有效
    • SESSION:在当前会话有效
      • 多个事务执行,只对该语句后面执行的事务有效
      • 可在开启的事务中执行,不影响之前正在执行的事务
      • 对当前会话后续的事务无效

查看事务隔离级别

mysql> SHOW VARIABLES LIKE 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.03 sec)
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.00 sec)

其实设置事务隔离级别相当于修改transaction_isolation的值。

设置隔离级别:

语法作用范围
SET GLOBAL transaction_isolation = 隔离级别全局
SET @@GLOBAL.var_name = 隔离级别全局
SET var_name = 隔离级别会话
SET SESSION var_name = 隔离级别会话
SET @@SESSION.var_name = 隔离级别会话
SET @@var_name = 隔离级别下一个事务

二、MYSQL4种隔离级别实战

创建个测试表

CREATE TABLE `test`.`test`  (`id` int NULL DEFAULT NULL,`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
INSERT INTO test values(1, 'zhangsan');

2.1 READ UNCOMMITTED

设置事务隔离级别、开启两个会话且开启事务,操作如下:(左边:事务a;右边:事务b)

                                                                图 2.1-1

 打开两个会话,事务隔离级别设置为 READ UNCOMMITTED(读未提交)

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

如图2.1-1中
脏读: name初始化为zhangsan,事务a修改name为lisi 且事务未提交,
事务b已读出name为lisi,而不是zhangsan(读未提交),出现了“脏读”现象。不可重复读:在事务b中两次读取的数据不一样,出现了“不可重复读”现象。

                                                                图 2.1-2

如图2.1-2中
在事务a插入新数据之前读name='zhangsan'和事务b读name='zhangsan'都为一条数据,
事务a插入一条数据且未提交,
幻读: 此时事务b用相同的查询条件,读出来了两条两次读出来不一致的数据,出现了“幻读”现象。

2.2 READ COMMITTED

设置事务隔离级别、开启两个会话且开启事务,操作如下:(左边:事务a;右边:事务b)

                                                                图2.2-1

如图2.1-1中,同时启动两个事务ab

name初始化为 'lisi',事务a修改name为 'zhangsan' 且事务未提交,事务b读name时,值仍然为 'lisi',而不是 'zhangsan'(读已提交)。当事务a提交了事务,事务读出的数据为 'zhangsan'。

未出现脏读: 在事务a未提交的情况下,事务b读的数据没有变化,未出现“脏读”现象。

不可重复读: 在同一个事务b中两次读取的数据不一致,出现了“不可重复读”现象。

幻读:在同一个事务b中相同条件下读数据不一致,出现了“幻读”现象。

2.3 REPEATABLE READ(MYSQL默认的隔离级别)

图 2.3-1

如图2.3-1,区域 1,同时启两个事务ab。

可重复读:事务ab执行之后,事务a删除id为2的数据,提交前或提交后,事务b再次读取的数据者与之前读取的数据保持一致。


如图2.3-1,区域 2,同时启两个事务ab。(事务a已提交,默认自动提交)

幻读:事务a插入一条新数据id为3(自动提交事务)后,事务b读取数据,还是两条,保证了可重复读特性。但,事务b可以修改 id=3 的数据,然后再查询就能把 id为3 的数据查询出来了,出现了幻读的现象。

2.4 SERIALIZABLE

                                                                图 2.4-1

 如图2.4-1,设置隔离级别为SERIALIZABLE,同时开启两个事务,各步骤说明和结论:

  • 1: 读 id = 1 的数据
  • 2: 修改 id = 1 的数据报锁超时,结论:读某数据且加锁,本事务可读写,别的事务只可读不可写
  • 3: 更新 id = 5 成功,无其它事务读或写的数据,可写
  • 4: 读 id = 5 报锁超时,结论:写某数据,别的事务不允许读也不允许写
  • 5: 插入 id = 2 成功,无其它事务读或写的数据,可写
  • 6: 范围查询 id (5, 11)
  • 7: 插入 id = 7 成功,无其它事务读或写的数据,可写
  • 8: 插入 id为6 报锁超时
  • 9: 插入 id为6 成功
  • 10: 范围查询 id (5, 11)
  • 11: 插入 id为7 成功
  • 12: 插入 id为8 报锁牛奶时,结论:范围查询加锁,该范围数据本事务可读写,其它事务只可读
  • 13: 插入 id = 12 成功,无其它事务读或写的数据 id = 12,可写

 如此,本事务查询的数据,本事务可修改,其它事务只可读; 本事务修改的数据,其它事务不可查询和修改。完美避免脏读、不可重复读、幻读等读现象。当然因各种加锁,使得该事务隔离级别下效率低下,耗费数据库性能,不推荐使用。

三、总结

        本文我们深入探索了MySQL事务隔离级别的奥秘。从READ UNCOMMITTED到SERIALIZABLE,每个级别都有其独特的特点和适用场景。READ UNCOMMITTED虽快但风险高,SERIALIZABLE则提供最严格的数据一致性保证但性能消耗大。在实际应用中,根据业务需求和性能考量,合理选择事务隔离级别至关重要。通过本次奇幻之旅,我们掌握了事务隔离级别的核心概念及实战,为在MySQL数据库中实现高效、稳定的数据处理提供了有力支持。

    希望你喜欢这次的探索之旅!不要忘记 "点赞" 和 "关注" 哦,我们下次见!🎈

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

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

相关文章

【话题】IT专业入门,高考假期预习指南

IT专业入门&#xff0c;高考假期预习指南 亲爱的高考学子们&#xff0c; 七月的阳光&#xff0c;如同你们的梦想&#xff0c;炽热而明亮。当你们手中的笔落下最后一道题的答案&#xff0c;那不仅仅是对过去十二年寒窗苦读的告别&#xff0c;更是对未知世界探索的启程号角。你们…

ExtruOnt——为工业 4.0 系统描述制造机械类型的本体

概述 论文地址 &#xff1a;https://arxiv.org/abs/2401.11848 原文地址&#xff1a;https://ai-scholar.tech/articles/ontology/ExtruOnt 在工业 4.0 应用场景中&#xff0c;以机器可解释代码提供的、语义丰富的制造机械描述可以得到有效利用。然而&#xff0c;目前显然还缺…

【数智化人物展】天云数据CEO雷涛:大模型连接数据库 为数智化提供高价值数据...

雷涛 本文由天云数据CEO雷涛投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 这几天&#xff0c;奥特曼讲SQL数据库和大模型结合起来会产生什么样的化学变化引起行业关注。为…

大模型备案全网最详细流程【附附件】

本文要点&#xff1a;大模型备案最详细说明&#xff0c;大模型备案条件有哪些&#xff0c;《算法安全自评估报告》模板&#xff0c;大模型算法备案&#xff0c;大模型上线备案&#xff0c;生成式人工智能(大语言模型)安全评估要点&#xff0c;网信办大模型备案。 大模型备案安…

中国石油大学(华东)24计算机考研数据速览,计科学硕复试线288分!

中国石油大学&#xff08;华东&#xff09;计算机与通信工程学院是中国石油大学(华东)十三个教学院部之一&#xff0c;其前身是创建于1984年的计算机科学系&#xff0c;2001年撤系建院。伴随着学校50多年的风雨历程&#xff0c;计算机与通信工程学院也已经有了20多年的发展历史…

5.pwn Linux的延迟绑定机制

动态链接库 我们程序开发过程中都会用到系统函数&#xff0c;比如read&#xff0c;write&#xff0c;open等等 这些系统函数不需要我们实现&#xff0c;因为系统已经帮你完成这些工作&#xff0c;只需要调用即可&#xff0c;存放这些函数的库文件就是动态链接库。 通常情况下&…

[激光原理与应用-100]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 4 - 3C电池行业应用 - 不同的电池类型、焊接方式类型

目录 前言&#xff1a; 一、激光在3C行业的应用概述 1.1 概述 1.2 激光焊接在3C-电池行业的应用 1.3 动力电池的激光焊接工艺 1.3.1 概述 1.3.2 动力电池常见的焊接应用 1.电池壳体与盖板焊接 2.电池防爆阀密封 焊接 二、不同的电池的外形 2.1 软包锂电池 2.1.1 概述…

《机器学习》读书笔记:总结“第4章 决策树”中的概念

&#x1f4a0;决策树 基于树结构进行决策。 一棵决策树包括&#xff1a; 一个 根节点&#xff08;起点&#xff09;若干 叶节点&#xff08;没有下游节点的节点&#xff09;若干 内部节点(分支节点) 即&#xff1a; #mermaid-svg-Mxe3d0kNg29PM2n8 {font-family:"treb…

Open3D 删除点云中重叠的点(方法二)

目录 一、概述 1.1原理 1.2应用 二、代码实现 三、实现效果 3.1原始点云 3.2处理后点云 3.3数据对比 一、概述 在点云处理中&#xff0c;重叠点&#xff08;即重复点&#xff09;可能会对数据分析和处理的结果产生负面影响。因此&#xff0c;删除重叠点是点云预处理中常…

NextJs - SSR渲染解决antd首屏加载CSS样式的闪烁问题

NextJs - SSR渲染解决antd首屏加载CSS样式的闪烁问题 闪烁现状解决方案 闪烁现状 我们写一个非常简单的页面&#xff1a; import { Button } from antdexport default async function Page() {return <><Button typeprimary>AAA</Button></> }NextJs…

《昇思25天学习打卡营第14天|onereal》

第14天学习内容如下&#xff1a; Diffusion扩散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻译迁移而来&#xff0c;同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件&#xff0c…

张量分解(1)——初探张量

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…

SpEL表达式相关知识点

SpEL表达式 知识点 Spel概述 Spring 表达式&#xff0c;即 Spring Expression Language&#xff0c;简称 SpEL。 那么是什么SpEL表达式呢&#xff1f; SpEL (Spring Expression Language) 是一种在Spring框架中用于处理表达式的语言。SpEL中的表达式可以支持调用bean的方法…

IntelliJ IDEA菜单不见了设置找回方法

通过CtrAltS键按出设置 找到View,然后自定义一个快捷键,然后保存 使用自定义快捷键弹出改界面,点击Main Menu即可

传感器标定(一)摄像头内参标定

一、使用ROS进行手动标定安装 1、安装 image-view &usb_cam ⽤于驱动相机 sudo apt-get install ros-melodic-image-view sudo apt-get install ros-melodic-usb-cam2、查看系统视频设备 v4l2- ctl -d /dev/video0 --all 查询所有相机具体的参数包括width和height ls /…

内容监管与自由表达:Facebook的平衡之道

在当今数字化信息社会中&#xff0c;社交媒体平台不仅是人们交流和获取信息的主要渠道&#xff0c;也是自由表达的重要舞台。Facebook&#xff0c;作为全球最大的社交网络平台&#xff0c;连接了数十亿用户&#xff0c;形成了一个丰富多样的信息生态。然而&#xff0c;如何在维…

vue项目中 i18n(vue-i18n) 国际化解决方案,从安装到使用

1、国际化介绍 国际化&#xff08;Internationalization&#xff0c;通常缩写为"i18n"&#xff09;是指设计和开发软件应用程序&#xff0c;使其能够轻松地适应不同的语言、文化和地区的需求。国际化不仅仅涉及将文字翻译成其他语言&#xff0c;还包括调整日期、时间…

数据列表组件-报表

当数据在后端接口查询到&#xff0c;需要在页面展示出来&#xff0c;如果项目有很多report &#xff0c;可以把列表做一个组件 效果如下&#xff1a; js代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title&g…

中英双语介绍东京的商业核心区域:日本桥(Nihonbashi)

中文版 日本的日本桥&#xff08;Nihonbashi&#xff09; 位置 日本桥位于东京中央区&#xff0c;是东京市中心的重要商业和金融区之一。日本桥的名字来源于这里的同名桥梁“日本桥”&#xff0c;该桥建于江户时代&#xff0c;横跨日本桥川&#xff0c;是当时五街道的起点&a…

作业训练二编程题3. 数的距离差

【问题描述】 给定一组正整数&#xff0c;其中最大值和最小值分别为Max和Min, 其中一个数x到Max和Min的距离差定义为&#xff1a; abs(abs(x-Max)-(x-Min)) 其中abs()为求一个数的绝对值 【输入形式】 包括两行&#xff0c;第一行一个数n&#xff0c;表示第二行有n个正整数…