[MySQL]事务的隔离级别原理与底层实现
目录
1.为什么要有隔离性
2.事务的隔离级别
读未提交
读提交
可重复读
串行化
3.演示事务隔离级别的操作
查看与设置事务的隔离级别
演示读提交操作
演示可重复读操作
1.为什么要有隔离性
在真正的业务场景下,MySQL服务在同一时间一定会有大量的客户端进程并发的去访问同一个MySQL服务,而且一定会同一时间有多个客户端访问和操作同一张表。而且我们在业务层面,一个事务很多情况下都需要多条SQL语句组成,那么这样的话,操作虽然是原子性的,但是过程却可以明显的分成执行前、执行中以及执行后三个阶段。
那么在执行中的阶段,一个客户端在执行事务操作数据库表,但是事务还没有完成提交,其其他客户端如果查看到该客户端没有提交的数据,会不会有问题呢?如果客户端查看了另一个客户端没有提交的数据,但是另一个客户端最后执行了回滚操作,那么该客户端查看的数据就不是真实的数据了,出现了数据的二义性。
所以说为了保证数据库在执行事务操作过程中尽量不受到干扰,就有了一个重要的特性就是隔离性。但是也并非客户端在执行事务的时候,不能让其他客户端查看自己没有提交的数据,在一些更关注数据的实时性的业务操作中,就能够接受短暂的数据不一致问题。
2.事务的隔离级别
事务的隔离级别分为读未提交、读提交、可重复读、串行化,不同的隔离界别可以让蛇舞收到不同程度的干扰,可以用于不同的业务场景。对于隔离级别的实现基本上都是通过锁实现了,因为多客户端访问也相当于是多线程的并发访问,所以说还是要用锁。对于不同的隔离级别,锁的使用是不同的,常见的有表锁、行锁、读锁、写锁等等。
对于事务的隔离级别是相对于自己而言的,如果说一个客户端A是读未提交,客户端B是读提交,那么客户端B想要提取客户端A在事务中操作的结果就需要在客户端A提交之后才可以看得到。
读未提交
该隔离级别属于是最低的隔离界别,相当于没隔离一样,所有的事物都可以看到其他事物没有提交的执行结果,这种隔离界别在实际的业务中基本上是不会使用的。会有很多的并发问题,例如脏读、幻读、不可重复读等问题。
脏读 | 一个事务读取到了另一个事务未提交的操作结果就是脏读。由于未提交的事务数据可能回因为事务的回滚而改变,所以读到的数据可能回出问题。 |
幻读 | 在一个事务内,按照某个条件进行数据查询的时候,第一次查询和第二次查询的结果集不同。可能是因为其他事务在这个期间对数据进行了操作。 |
不可重复读 | 在一个事务内,对于同一个数据的多次读取结果不一致叫做不可重复读。可能因为在该事务执行期间,其他事务对这个数据进行了修改等操作,导致了读取数据的变化,造成了该问题。 |
脏读更加聚焦于数据的插入和删除操作,两次查看的数据量不一样,而不可重复读更聚焦于数据的修改和删除的操作,两次查看的数据量可能一样,但是里面的数据不一样。
读提交
该隔离级别是大多数数据库的默认隔离级别(但不是MySQL的),也是普遍理解上最合适的一个隔离级别。该隔离级别规定了,一个事务只能看到其他的已经提交的事务所改变的数据操作。这种级别的隔离就不会产数据的脏读问题了。因为只能读取到提交之后的存放在磁盘当中的永久化数据。但是还是会有不同重复读取的问题,因为多次查看表数据的时候,在此其他其他事务可能回修改表并提交事务。
可重复读
这是MySQL的默认隔离级别,他确保同一个事务,在执行的过程中多次读取操作数据的时候,回看到同样的数据行。使得数据不会出现脏读、不可重复读取的问题,但是会有幻读的问题。
串行化
串行化是数据库事务隔离级别中最高的级别。在串行化隔离级别下,事务的执行是顺序的,一个事务必须等待前一个事务完成(提交或者回滚)之后才能开始执行,在等待过程中就会放入等待队列。就好像多个事务是在一条单行道上排队依次通过一样,完全避免了并发事务之间的相互干扰。他会在每个读的数据行上面加上共享锁,但是加锁就会有锁的竞争问题,会大大降低效率。这种级别不会有任何的事务之间相互影响的问题了。
3.演示事务隔离级别的操作
查看与设置事务的隔离级别
事务隔离级别的设置分为全局的和会话级别的设置,如果设置会话级别的话,就相当于是对于一个客户端连接的设置,关闭之后再重启还是会重制事务的隔离级别,会按照全局的事务隔离界别来定义。
对于设置会话级别的事务隔离性不需要重启服务器,但是设置全局级别话需要重启,因为事务的隔离级别是受会话影响的,客户端启动的会话隔离级别是从全局隔离级别复制过来的,所以说全局隔离级别决定了客户端启动的时候的事务隔离级别,但是事务在操作的时候,是看会话的事务隔离级别的。
查看语法:SELECT @@[SESSION | GLOBAL].TRANSACTION_ISOLATION;
设置语法:SELECT [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE };
演示读提交操作
//客户但A————————————————————————————————————————————————————————
//设置会话隔离级别为读提交
mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)//开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)//插入与提交事务
mysql> insert into account values(1, '张三', 100), (2, '李四', 200);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql> commit;
Query OK, 0 rows affected (0.01 sec)//客户但B————————————————————————————————————————————————————————
//设置会话隔离级别为读提交
mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)//开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)//在客户端A提交之前查看表数据
mysql> select * from account;
Empty set (0.00 sec)//在客户端A提交之后查看表数据
mysql> select * from account;
+----+--------+--------+
| id | name | blance |
+----+--------+--------+
| 1 | 张三 | 100.00 |
| 2 | 李四 | 200.00 |
+----+--------+--------+
2 rows in set (0.00 sec)//提交数据
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
该操作,客户端B在事务期间,两次查看表数据的数据不一样,这就是不可重复读。
演示可重复读操作
//客户但A————————————————————————————————————————————————————————
//设置会话隔离级别为可重复读
mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)//开启事务,插入数据,提交事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into account values(3, '王五', 300);
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)//客户但B————————————————————————————————————————————————————————
//设置会话隔离级别为可重复读
mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)//开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
//客户端A提交之前
mysql> select * from account;
+----+--------+--------+
| id | name | blance |
+----+--------+--------+
| 1 | 张三 | 100.00 |
| 2 | 李四 | 200.00 |
+----+--------+--------+
2 rows in set (0.00 sec)//客户端A提交之后
mysql> select * from account;
+----+--------+--------+
| id | name | blance |
+----+--------+--------+
| 1 | 张三 | 100.00 |
| 2 | 李四 | 200.00 |
+----+--------+--------+
2 rows in set (0.00 sec)//提交事务
mysql> commit;
Query OK, 0 rows affected (0.00 sec)//自己提交事务之后查看表数据
mysql> select * from account;
+----+--------+--------+
| id | name | blance |
+----+--------+--------+
| 1 | 张三 | 100.00 |
| 2 | 李四 | 200.00 |
| 3 | 王五 | 300.00 |
+----+--------+--------+
3 rows in set (0.00 sec)
相关文章:

[MySQL]事务的隔离级别原理与底层实现
目录 1.为什么要有隔离性 2.事务的隔离级别 读未提交 读提交 可重复读 串行化 3.演示事务隔离级别的操作 查看与设置事务的隔离级别 演示读提交操作 演示可重复读操作 1.为什么要有隔离性 在真正的业务场景下,MySQL服务在同一时间一定会有大量的客户端进程…...

项目升级Sass版本或升级Element Plus版本遇到的问题
项目升级Sass版本或升级Element Plus版本遇到的问题 如果项目有需求需要用到高版本的Element Plus组件,则需要升级相对应的sass版本,Element 文档中有提示,2.8.5及以后得版本,sass最低支持的版本为1.79.0,所升级sass、…...

C++中,存储两个相同类型的数据,数据结构
在C中,存储两个相同类型的数据,可以使用多种数据结构。这里有几种常见且合适的选择: 简单的变量: 最直接的方式就是使用两个独立的变量。这种方法简单直观,但不够结构化。 cpp int a 5; int b 10; std::pair&#x…...

python实战(十五)——中文手写体数字图像CNN分类
一、任务背景 本次python实战,我们使用来自Kaggle的数据集《Chinese MNIST》进行CNN分类建模,不同于经典的MNIST数据集,我们这次使用的数据集是汉字手写体数字。除了常规的汉字“零”到“九”之外还多了“十”、“百”、“千”、“万”、“亿…...

[论文阅读] (37)CCS21 DeepAID:基于深度学习的异常检测(解释)
祝大家新春快乐,蛇年吉祥! 《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正࿰…...

Linux - 进程间通信(2)
目录 2、进程池 1)理解进程池 2)进程池的实现 整体框架: a. 加载任务 b. 先描述,再组织 I. 先描述 II. 再组织 c. 创建信道和子进程 d. 通过channel控制子进程 e. 回收管道和子进程 问题1: 解答1ÿ…...

Kafka 消费端反复 Rebalance: `Attempt to heartbeat failed since group is rebalancing`
文章目录 Kafka 消费端反复 Rebalance: Attempt to heartbeat failed since group is rebalancing1. Rebalance 过程概述2. 错误原因分析2.1 消费者组频繁加入或退出2.1.1 消费者故障导致频繁重启2.1.2. 消费者加入和退出导致的 Rebalance2.1.3 消费者心跳超时导致的 Rebalance…...

SpringBoot+Electron教务管理系统 附带详细运行指导视频
文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBootElectron框架开发的教务管理系统。首先ÿ…...

操作系统(Linux Kernel 0.11Linux Kernel 0.12)解读整理——内核初始化(main init)之控制台工作
前言 在 Linux 内核中,字符设备主要包括控制终端设备和串行终端设备,对这些设备的输入输出涉及控制台驱动程序,这包括键盘中断驱动程序 keyboard.S 和控制台显示驱动程序 console.c,还有终端驱动程序与上层程序之间的接口部分。 终端驱动程序…...

Autogen_core: Message and Communication
目录 完整代码代码解释1. 消息的数据类:2. 创建代理人(MyAgent):3. 创建和运行代理人的运行时环境:4. 根据发送者路由消息的代理(RoutedBySenderAgent):5. 创建和运行带路由的代理&a…...

ComfyUI工作流教程、软件使用、开发指导、模型下载
在人工智能和设计技术迅速发展的今天,AI赋能的工作流已成为创意设计与生产的重要工具。无论是图片处理、服装试穿,还是室内设计与3D建模,这些智能化的解决方案极大地提高了效率和创作质量。 为了帮助设计师、开发者以及AI技术爱好者更好地利用这些工具,我们整理了一份详尽…...

零基础Vue学习1——Vue学习前环境准备
目录 环境准备 创建Vue项目 项目目录说明 后续开发过程中常用命令 环境准备 安装开发工具:vscode、webstorm、idea都可以安装node:V22以上版本即可安装pnpm 不知道怎么安装的可以私信我教你方法 创建Vue项目 本地新建一个文件夹,之后在文件夹下打开…...

定西市建筑房屋轮廓数据shp格式gis无偏移坐标(字段有高度和楼层)内容测评
定西市建筑房屋轮廓数据是GIS(Geographic Information System,地理信息系统)领域的重要资源,用于城市规划、土地管理、环境保护等多个方面。这份2022年的数据集采用shp(Shapefile)格式,这是一种…...

汉语向编程指南
汉语向编程指南 一、引言王阳明代数与流形学习理论慢道缓行理性人类型指标系统为己之学与意气实体过程晏殊几何学半可分离相如矩阵与生成气质邻域镶嵌气度曲面细分生成气质邻域镶嵌气度曲面细分社会科学概论琴生生物机械科技工业研究所软凝聚态物理开发工具包琴生生物机械 报告…...

Writing an Efficient Vulkan Renderer
本文出自GPU Zen 2。 Vulkan 是一个新的显式跨平台图形 API。它引入了许多新概念,即使是经验丰富的图形程序员也可能不熟悉。Vulkan 的主要目标是性能——然而,获得良好的性能需要深入了解这些概念及其高效应用方法,以及特定驱动程序实现的实…...

AI常见的算法
人工智能(AI)中常见的算法分为多个领域,如机器学习、深度学习、强化学习、自然语言处理和计算机视觉等。以下是一些常见的算法及其用途: 1. 机器学习 (Machine Learning) 监督学习 (Supervised Learning) 线性回归 (Linear Regr…...

LibreChat
文章目录 一、关于 LibreChat✨特点 二、使用LibreChat🪶多合一AI对话 一、关于 LibreChat LibreChat 是增强的ChatGPT克隆:Features Agents, Anthropic, AWS, OpenAI, Assistants API, Azure, Groq, o1, GPT-4o, Mistral, OpenRouter, Vertex AI, Gemi…...

Spring Boot 日志:项目的“行车记录仪”
一、什么是Spring Boot日志 (一)日志引入 在正式介绍日志之前,我们先来看看上篇文章中(Spring Boot 配置文件)中的验证码功能的一个代码片段: 这是一段校验用户输入的验证码是否正确的后端代码,…...

Spring Boot 实现文件上传和下载
文章目录 Spring Boot 实现文件上传和下载一、引言二、文件上传1、配置Spring Boot项目2、创建文件上传控制器3、配置文件上传大小限制 三、文件下载1、创建文件下载控制器 四、使用示例1、文件上传2、文件下载 五、总结 Spring Boot 实现文件上传和下载 一、引言 在现代Web应…...

慕课:若鱼1919的视频课程:Java秒杀系统方案优化 高性能高并发实战,启动文档
代码: Javahhhh/miaosha191: 运行成功了慕课若鱼1919的视频课程:Java秒杀系统方案优化 高性能高并发实战https://github.com/Javahhhh/miaosha191 https://github.com/Javahhhh/miaosha191 miaosha项目启动文档 需安装的配置环境: VMwar…...

React第二十七章(Suspense)
Suspense Suspense 是一种异步渲染机制,其核心理念是在组件加载或数据获取过程中,先展示一个占位符(loading state),从而实现更自然流畅的用户界面更新体验。 应用场景 异步组件加载:通过代码分包实现组件…...

虚幻基础08:组件接口
能帮到你的话,就给个赞吧 😘 文章目录 作用 作用 组件接口:可以直接调用对方的组件接口,而无需转换为actor。 实现对象间的通知。 A 通知 B 做什么。...

iPhone SE(第三代) 设备详情图
目录 产品宣传图内部图——后设备详细信息 产品宣传图 内部图——后 设备详细信息 信息收集于HubWeb.cn...

2025苹果CMS v10短剧模板源码
文件不到70kb,加载非常快 无配置,没有详情页,上传就可以直接使用 使用教程:上传到网站template目录并解压、进入网站后台选择模板 注意:默认调用ID为1的数据和扩展分类,建议新建站使用 源码下载…...

2007-2020年各省国内专利申请授权量数据
2007-2020年各省国内专利申请授权量数据 1、时间:2007-2020年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区名称、年份、国内专利申请授权量(项) 4、范围:31省 5、指标解释:专利是专利权的简称&…...

第一天-嵌入式应用开发介绍
首先,我们来介绍一下嵌入式的发展路线,虽然嵌入式的知识点众多,但是总体上来说,嵌入式分为以下两条主要路线: 单片机开发ArmLinux开发 当然,还有其他的一些例如FPGA这种的我们就不计算在内了,F…...

约瑟夫问题(信息学奥赛一本通-2037)
【题目描述】 N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M 的人出圈;…输出依次出圈的人的编号。 【输入】 输入N和M。 【输出】 输出一行,依次出圈的人的编号。 【输入样…...

WPF5-x名称空间
1. x名称空间2. x名称空间内容3. x名称空间内容分类 3.1. x:Name3.2. x:Key3.3. x:Class3.4. x:TypeArguments 4. 总结 1. x名称空间 “x名称空间”的x是映射XAML名称空间时给它取的名字(取XAML的首字母),里面的成员(如x:Class、…...

一个python项目中的文件和目录的作用是什么?scripts,venv,predict的具体含义
今天学习SadTalker的项目,但目录和文件不知道都是干什么的,总结记录下,方便后续使用。 目录 1. docs: 作用: 这个文件夹通常包含项目的文档。文档可能包括用户指南、API 文档、开发文档等。 2. examples: 作用: 这里通常包含一些示例代码…...

python学opencv|读取图像(四十八)使用cv2.bitwise_xor()函数实现图像按位异或运算
【0】基础定义 按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。 按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。 按位取反运算:一个二进制数,0变1,1变0。 按…...