[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…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...