【计算机网络安全】湖北大学-mysql事务隔离性实验

参考数据库实验:并发控制实验(MySQL)-CSDN博客,大佬写的很好


实验环境

实验需要mysql环境,如果我们本机有mysql客户端,或者安装过phpstudy都可以直接用,Kali似乎也有。

本机启动phpstudy,然后打开mysql命令行

输入密码进入

如果进不去,输入mysql -uroot  -proot,其中root填你的用户名密码,phpstudy中可以重置 

事务的隔离级别

名字

隔离级别

脏读

不可重复读

幻读

读未提交

read uncommitted

读已提交

read committed

可重复读

repeatable read

串行化

serializable

1. 读未提交

最低的隔离级别,允许一个事务读取另一个事务未提交的数据。

2. 读已提交

事务只能读取到已提交的事务所做的更改。

3. 可重复读

在同一事务内多次读取相同的数据会得到相同的结果。

4. 序列化

最严格的隔离级别,确保事务串行执行,完全避免了所有并发问题。

三种要解决的并发问题

1. 脏读(Dirty Read)

定义
脏读是指一个事务能够读取到另一个事务未提交的数据。这种情况可能导致读取的数据不一致,因为未提交的事务可能会被回滚。

示例

  • 事务 A 更新了某条记录但尚未提交。
  • 事务 B 读取了事务 A 更新后的数据。
  • 如果事务 A 随后回滚,事务 B 读取的结果就变得无效,因为它读取了未提交的数据。

2. 不可重复读(Non-Repeatable Read)

定义
不可重复读是指在同一事务中,多次读取相同的数据时,读取的结果可能不同。这通常发生在另一个事务在中间修改并提交了数据。

示例

  • 事务 A 第一次读取某条记录的值。
  • 事务 B 在事务 A 进行时更新了同一条记录并提交。
  • 事务 A 再次读取同一条记录的值,发现与第一次读取的值不同。

3. 幻读(Phantom Read)

定义
幻读是指在同一事务中,两次查询返回的结果集不同,通常是因为其他事务插入了新的记录。这种现象在第二次查询时会出现“幻影”记录,即在第一次查询中不存在,但在第二次查询中出现。

示例

  • 事务 A 运行查询,返回符合条件的记录(例如,所有年龄大于 20 的用户)。
  • 事务 B 插入了一条新的记录(例如,年龄为 22 的用户)。
  • 事务 A 再次运行相同的查询,发现多了一条新记录。

实验

我们首先查询一下查询事务的隔离级别

select @@transaction_isolation;           5.7版本以下
select @@tx_isolation;            5.7版本以上

我们将事务的隔离级别设置为读未提交

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

 插入实验数据

创建测试数据表:

Create database test_db;

进入对应数据库:

Use test_db;

创建测试数据库:

由于用老师的代码复制全部报错,于是我用ai改了改。

CREATE TABLE `user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`age` tinyint(3) DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_abc` (`name`, `age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

插入测试数据

INSERT INTO user (`name`, `age`) VALUES ('zhangsan', 23);

 实验步骤:

设置不同的隔离级别,进行实验验证:在不同的隔离级别下,多个事务对相同数据的操作,所看到的结果不一样,(脏读、不可重复读、幻读等情况)。

在读已提交和可重复读的隔离级别下,使用mvcc的read view进行可见性算法的推导,然后使用实验进行结果验证。

我们开启两个客户端,那么就有两个线程,从而我们可以把它当作事务A和事务B。

取消MySQL的自动提交功能

【不推荐】设置完不自动提交后(set autocommit = 0;),通过begin开启事务,写完SQL语句,需要进行commit或者rollback处理

set autocommit = 0;
begin;
commit; or rollback

【推荐】或者采用事务的方式,输入“start transaction”来开始 事务,最后进行commit或者rollback。

start transaction;
commit; or rollback

注意每次commit或者rollback都要重新start transaction;!!!!!!

读未提交:

设置隔离级别并查看,将A、B线程的隔离级别均设置为读未提交。经验证,当前隔离级别无法解决脏读、不可重复读、幻读。

set @@session.tx_isolation='READ-UNCOMMITTED'; #设置当前线程隔离级别
show variables like 'tx_isolation'; #查看隔离级别

 我们先查询一下表中的数据

1. 脏读

我们在A事务中将age改成18,但是不提交,在B事务中查询age的值,在A中再回滚,看是否发生脏数据。

如下图,A事务对money字段由36修改为18时,但是未提交。B事务读取的age字段为18,为A事务未提交的数据。即读到了并不一定最终存在的数据,就是脏读。本次实验中,A事务最终回滚,导致B读取到的数据与数据库中的真实数据23不一致。

2. 不可重复读

由下图,由于收到B事务对数据的修改操作,A事务连续两次对数据的读取出现了不一致现象,说明对于当前的隔离级别,无法避免不可重复读问题。

3. 幻读

在A事务中查询user中所有数据,共1条,然后在B事务中插入一条数据,此时,在 A 中按照相同条件查询,查询到的结果多了一条,产生了幻读现象。因此在当前隔离级别下,无法避免幻读问题。

插入数据

 INSERT INTO user (`name`, `age`) VALUES ('liu', 24);

读已提交(Read Committed)

设置隔离级别并查看,将A、B线程的隔离级别均设置为读已提交(Read Committed)。

set @@session.tx_isolation='READ-COMMITTED';
show variables like 'tx_isolation';

经验证,当前隔离级别可以解决脏读,但无法避免不可重复读、幻读。

1.脏读

 可以发现解决了脏读的问题

2. 不可重复读

经过实验不能避免不可重复读,B读取的两次数据不一样

3. 幻读

在A事务中查询user中所有数据,共3条,然后在B事务中插入一条数据,此时,在 A 中按照相同条件查询,查询到的结果多了一条,产生了幻读现象。因此在当前隔离级别下,无法避免幻读问题。

可重复读(Repeated Read)

设置隔离级别并查看,将A、B线程的隔离级别均设置为可重复读(Repeated Read)。

set @@session.tx_isolation='REPEATABLE-READ';
show variables like 'tx_isolation';

1.脏读

可以避免重复读,A更新提交,B还是不变

 2.不可重复读

B读到了A更新前的数据,

3.幻读

 实验过程中,在A事务中查询user中所有数据,共4条,然后在B事务中插入一条数据,并提交事务。此时,在 A 中按照相同条件查询,查询到的结果仍然为4条,没有产生幻读现象。当A提交事务时,查询到了新增的记录。

 查看别人的博客,这也是幻读的一种,但是还不理解。

串行化(Serializable)

设置隔离级别并查看,将A、B线程的隔离级别均设置为串行化(Serializable)。

set @@session.tx_isolation='SERIALIZABLE'; #设置当前线程隔离级别,GLOBAL全局
show variables like 'tx_isolation'; #查看隔离级别

或者设置全局隔离级别:

set global transaction isolation level SERIALIZABLE;

经验证,当前隔离级别可以解决脏读、不可重复读、幻读,验证过程见下文。

1. 脏读,不可重复读,串行化

 串行化是最严格的隔离级别,要求事务按顺序执行.B事务在未提交的时候,A事务会一直在阻塞状态,事务本质上进入了串行状态,所以有效的避免了这三种情况。

 总结

通过这次实验深入了解了四种事务隔离机制的原理。在数据库管理系统中,并发控制是确保多个事务能够安全、有效地并发执行的重要机制。MySQL 提供了多种事务隔离级别,以应对不同的并发场景。遇到了很多问题,最后也得以解决。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

UE5 猎户座漂浮小岛 08 构造脚本

视频教程 90后小陈老师的个人空间-90后小陈老师个人主页-哔哩哔哩视频 1.构造脚本 1.1 简介 类似构造函数代码创建多个效率高 1.2 添加静态网格体 1.3 散乱立方体 使用for循环生产10个立方体 随机位置生成10个散乱的立方体 1.4 整齐立方体 1.5 随机物体 1.6 样条实现曲度墙…

OpenHarmony-2.DeviceInfo适配

DeviceInfo适配说明 1.启动子系统设备信息说明 2.OHOS 2.1.OHOS 固定值参数适配 OHOS 固定值参数: const.ohos.version.security_patch const.ohos.releasetype const.ohos.apiversion const.ohos.fullname适配说明: OHOS 固定值参数由OHOS系统填充&#xff0…

【电机控制】数学——微分

【电机控制】数学——微分 文章目录 [TOC](文章目录) 前言一、导数二、梯度三、▽算子四、散度四、旋度五、积规则a.函数求导1、函数之和求导2、函数与常数求导3、两个函数乘积求导4、一个函数除以一个函数求导 b.矢量函数求导1.构造标量2.构造矢量 c.梯度求导d.散度求导e.旋度…

day04(单片机高级)硬件基础

目录 硬件基础 初级硬件工程师 中级硬件工程师 高级硬件工程师 需要学习的知识点 硬件基础 初级硬件工程师 了解数字电路、模拟电路知识,熟悉常用电子元器件的性能原理; 熟悉PCB设计流程和规范(华为),熟悉Altium Desig…

Nginx 使用入门介绍

大家好,我是G探险者! 今天聊一聊nginx. Nginx 是一款高性能的 Web 服务器、反向代理服务器以及负载均衡器。它因其轻量级、稳定性和高并发处理能力,在全球范围内得到了广泛应用。许多大型网站(如 Netflix、Dropbox 和 WordPress…

停车场空位引导系统

随着城市化进程的加速和汽车保有量的持续增长,传统停车场面临着前所未有的压力。在这些停车场中,停车困难与寻找自己的停车位麻烦复杂已成为许多驾驶者日常出行的一大痛点。 一.传统停车场痛点 在传统停车场中,车位难找,停车场缺…

([LeetCode仓颉解题报告] 661. 图片平滑器

[LeetCode仓颉解题报告] 661. 图片平滑器 一、 题目1. 题目描述2. 原题链接 二、 解题报告1. 思路分析2. 复杂度分析3. 代码实现 三、 本题小结四、 参考链接 一、 题目 1. 题目描述 2. 原题链接 链接: 661. 图片平滑器 二、 解题报告 1. 思路分析 由于只需要3*39个格子&am…

SpringCloud多机部署,负载均衡-LoadBalance

一.负载均衡 1.1问题描述 //根据应用名称获取服务列表 List<ServiceInstance> instancesdiscoveryClient.getInstances("product-service"); //一个微服务可能有多个实例&#xff0c;获取第一个 EurekaServiceInstance instance(EurekaServiceInstance)insta…

基于Java Springboot甘肃旅游管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

软考-信息安全-网络安全体系与网络安全模型

4.1 网络安全体系概述 网络安全保障是一项复杂的系统工程&#xff0c;是安全策略&#xff0c;多种技术&#xff0c;管理方法和人员安全素质的综合。 4.1.1 网络安全体系概念 现代的网络安全问题变化莫测&#xff0c;要保障网络系统的安全&#xff0c;应当把相应的安全策略&a…

CSS基础选择器与div布局

基础选择器一 全局选择器 可以与任何元素匹配&#xff0c;优先级最低&#xff0c;不推荐使用 *{margin: 0;padding: 0;}元素选择器 HTML文档中的元素&#xff0c;p、b、div、a、img、body等。 标签选择器&#xff0c;选择的是页面上所有这种类型的标签&#xff0c;所以经常…

Python毕业设计选题:基于Spark的国漫推荐系统的设计与实现-django+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统登录 管理员功能界面 漫画数据管理 看板界面 系统管理 摘要 系统的设计主要包括…

Linux 链式与层级中断控制器讲解:原理与驱动开发

往期内容 本专栏往期内容&#xff0c;interrtupr子系统&#xff1a; 深入解析Linux内核中断管理&#xff1a;从IRQ描述符到irq domain的设计与实现Linux内核中IRQ Domain的结构、操作及映射机制详解中断描述符irq_desc成员详解Linux 内核中断描述符 (irq_desc) 的初始化与动态分…

“数字化”让党建更“智慧”:帆软塑造党建发展新动能

智慧党建是新时代党的建设的重要创新&#xff0c;它通过互联网、大数据、云计算和人工智能等现代信息技术&#xff0c;实现了党建工作的数字化、智能化。帆软公司的Fine产品线&#xff0c;包括FineDataLink、FineReport、FineVis和FineBI&#xff0c;提供了一个全面的大数据分析…

利用c语言详细介绍下冒泡排序

软件开发过程中&#xff0c;排序算法是常规且使用众多的方法之一&#xff0c;而冒泡算法又是排序算法中最常规且基本的算法。今天我们利用c语言&#xff0c;图文详细介绍下冒泡算法。 一、图文介绍 我们输入一个数组&#xff0c;数组为【10&#xff0c;5&#xff0c;3&#xf…

小程序-基于java+SpringBoot+Vue的实习生管理系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

全新升级抗性宏基因组,直击病毒和毒力因子分析!

基于宏基因组测序的抗性基因分析是目前抗性基因分析的重要手段。为了协助研究工作者对抗性基因开展更深入且全面的探研&#xff0c;凌恩生物技术团队致力于技术研发&#xff0c;推出了全新升级版的宏基因组抗性基因分析流程。此流程采用五大数据库进行详尽的注释分析&#xff0…

算法--“汽车加油”问题.

def greedy():n 100 # 汽车满油后可行驶的最大距离d [50, 80, 39, 60, 40, 32] # 加油站的距离k len(d) # 加油站的数量# 检查是否有加油站距离超过汽车的最大行驶距离for dist in d:if dist > n:print(no solution)returnnum 0 # 加油次数current_position 0 # 当…

细说STM32单片机DMA中断收发RTC实时时间并改善其鲁棒性的方法

目录 一、DMA基础知识 1、DMA简介 (1)DMA控制器 (2)DMA流 (3)DMA请求 (4)仲裁器 (5)DMA传输属性 2、源地址和目标地址 3、DMA传输模式 4、传输数据量的大小 5、数据宽度 6、地址指针递增 7、DMA工作模式 8、DMA流的优先级别 9、FIFO或直接模式 10、单次传输或突…

HTTP 缓存策略

文章目录 一、HTTP的缓存的过程是怎样的&#xff1f;二、什么时候触发强缓存或协商缓存强缓存ExpiresCache-Control 协商缓存 三、服务器如何判断资源是否新鲜Last-Modified/If-Modified-SinceETag/If-None-Match 四、整体缓存过程 一、HTTP的缓存的过程是怎样的&#xff1f; …