什么是 脏写,脏读,幻读,不可重复读?怎样能解决这四种问题?

news2024/10/6 14:24:14

我们通过如下语句先创建一个 student 学生表。我就以对学生表的操作来解释什么是脏写,脏读,幻读,不可重复读

创建完成之后随便插入一条数据

1. 脏写?

对于两个事务 SessionA,SessionB,如果SessionA修改了另一个未提交的SessionB修改过的数据,这种现象我们称为脏读。过程如下图所示

假设我们对刚才的 student 学生表做一些操作,SessionA事务修改学号为1的姓名为张三,SessionB事务修改学号为1的姓名为李四。

第一步:SessionA开始了修改姓名这个事务操作;

第二步:SessionB也开始了修改姓名这个事务操作;

第三步:SessionB完成了修改姓名这一步操作,并在内存中进行了提交,但未保存至磁盘;

第四步:SessionA完成了修改姓名这一步操作,并在内存中进行了提交,也未保存至磁盘;

第五步:SessionA开始将数据写入磁盘,进行持久化保存;

第六步:SessionB事务中途出现了一些状况,事务回滚;

因为SessionA是在SessionB之后修改的姓名,SessionB回滚就会将SessionA所写的数据张三回滚成原来的小谷,这样的话,表面看来,SessionA顺利进行,实际上由于SessionB的回滚操作,导致我们SessionA的写操作根本没有成功,但我们得到的却会是SessionA事务执行成功,这种现象就是脏写。

2. 脏读?

对于两个事务SessionA,SessionB。SessionA读取了SessionB更新了但未提交的数据,之后若SessionB进行了回滚,那么SessionA读取到的数据就是临时而且无效的数据,这种现象称为脏读。过程如下图所示

假设事务SessionA要查询学号为1的学生信息,事务SessionB要修改学号为1的学生信息。

第一步:SessionA开始事务操作;

第二步:SessionB也开始事务操作;

第三步:SessionB修改了学号为1的学生信息,并在内存进行了暂时提交,未最终提交;

第四步:SessionA查询学号为1的学生信息,查询到的是SessionB刚刚修改过的信息;

第五步:SessionA查询之后,返回数据,并提交事务;

第六步:SessionB再提交的过程中出现错误,事务回滚;

因为SessionB进行了回滚,那么SessionB所作的修改都会被撤回,更新操作未成功,但是我们的SessionA中读取到的是SessionB暂时更新后的数据,此时查询到的数据与保存在数据库中的真实数据不相同,这种情况就称为脏读。

3. 不可重复读

两个事务 显式SessionA,隐式事务SessionB。(这里说一下,显式事务需要手动开启和提交,而隐式事务会自动开启和提交) SessionA从数据库读取到了一条数据,SessionB更新SessionA读取的那条数据并提交,此时SessionA事务再次进行查询该数据,发现这一次查询的结果与上一次不同,两者不一致,这种现象被称为不可重复读。过程如下图所示

第一步:SessionA开始事务;

第二步:SessionA查询学号为1的学生信息,查询到王五;

第三步:SessionB修改了学号为1的学生姓名;

第四步:SessionA再次查询,发现查询到的是SessionB修改后的张三,与刚才读到的数据王五不一致,后面第五第六步是再次修改和查询。

因为SessionA在查询到王五之后,可能去执行其他SQL语句了。然后SessionB对其作了修改,SessionA再次查询数据,发现数据不一致,这种情况称为不可重复读。这里注意,不可重复读重点关注的是每一行的数据是否一致,不过分关注读取到的数据量是否相同。

4. 幻读

两个事务 SessionA,SessionB。SessionA从一个表中读取到了某些字段的值,然后SessionB在表中添加了一些新的数据,SessionA再次去读的时候,发现多了一些数据,这种现象称为幻读。过程如下图所示

第一步:SessionA开启事务;

第二步:SessionA查询数据,之查询到了一条满足条件的数据张三;

第三步:SessionB向表中添加了一些新的数据;

第四步:SessionA再次查询数据,发现满足条件的数据变多了,像产生了幻觉一样,这种情况就是幻读。还有一种情况就是SessionB执行的是删除操作,当SessionA再次查询时,发现少了一些记录,也可以称作幻读。幻读主要关注读取到的数据量是否与之前一致,这一点与刚才的不可重复读略有区别。

5. 四种隔离级别

上面我们提到了脏写,脏读,不可重复读,幻读四种可能发生的并发问题,它们的严重程度也是有先后之分的,在我们看来,他们的严重程度是 脏写 > 脏读 > 不可重复度 > 幻读。

在我们的理想状态下,当然是希望将上面的四个问题全部解决,但是这样做,会导致我们数据库并发能力非常弱,这对于我们业务高并发是不兼容的,因此在实际开发过程中,我们通常会设置一些隔离级别,这些隔离级别越低,并发问题发生的就越多,但同时并发能力越高。

SQL 标准中一共设立了四种隔离级别。

READ UNCOMMITTED:读未提交,在这种隔离级别下,我们的事务可以读取到其他事务还没有提交的数据。不能避免脏读,不可重复读,幻读。

READ COMMITTED:读已提交,它满足了事务的简单特性,一个事务只能看到一个已经提交事务所作出的改变。这个隔离级别也是大多数数据库默认的隔离级别,可以避免不可重复读,幻读。

REPEATABLE READ:可重复读,当事务A读取到一条数据时,若事务B对该数据做了修改,事务A再次查询此数据,查询到的还是原来未修改的数据,解决了不可重复读,脏写,脏读的问题。

SERIALIZABLE:可串行化,确保一个事务可以从一个表中读取相同的行,在这个事务持续期间,其他事务不能对该表进行插入,修改,删除操作,所有的并发问题都得到了解决,但是效率确实非常的低。

上述四种隔离级别都解决了脏写的问题,因为脏写问题是最为严重的,所以上述四种隔离级别都解决了脏写问题,大致可以总结为以下一张图表

其实通过上面的介绍,同学们应该也能看出来一个特点,数据库的隔离程度越高,并发效率越低;数据库的隔离程度越低,并发效率越高。

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

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

相关文章

无公网IP,公网SSH远程访问家中的树莓派教程

文章目录 前言 如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar内网穿透4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地…

Timeplate Definition

timeplate定义描述单个tester cycle,并指定所有event edges被放置在cycle的位置。 必须在引用之前定义所有的timeplates。一个procedure必须有至少一个timeplate定义,所有的时钟必须在timeplate定义中进行定义,timeplate的定义有以下格式&am…

C++ STL关联式容器(详解)

STL关联式容器 C STL关联式容器是什么? 在《C STL容器》一节中讲到,C 容器大致分为 2 类,即序列式容器和关联式容器。其中,序列式容器(包括 array、vector、list、deque 和 forward_list)已经在前面章节中…

【校招VIP】前端JS语言考点之Vue考察

考点介绍: Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具…

我的编程语言学习笔记

前言 作为一名编程初学者,我深知学习编程需要不断积累和记录。在这篇博客文章中,我将分享一些我在学习C/C编程语言过程中记录的常用代码、特定函数、复杂概念以及特定功能。希望能与大家一起切磋进步! 常用代码: 1. 输入输出操作…

19----C/C++之加密解密带空格字符串的读入

本文主要通过一道题目来讲解C语言相关的简单加密和解密,以及如何读入带有空格的字符串 小试牛刀 题目描述 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密。我们给出一种最简单的加密方法,对给定的一个字…

【爬虫练习之glidedsky】爬虫-基础1

题目 链接 爬虫的目标很简单,就是拿到想要的数据。 这里有一个网站,里面有一些数字。把这些数字的总和,输入到答案框里面,即可通过本关。 思路 找到调用接口 分析response 代码实现 import re import requestsurl http://www.…

冠达管理:印花税是什么意思?港股取消印花税是利好还是利空?

在股票市场上,投资者买卖股票需求交纳必定的手续费用,比如,佣钱费用、过户费用、印花税等等,那么,印花税是什么意思?港股撤销印花税是利好仍是利空?下面冠达管理为大家准备了相关内容&#xff0…

QT处理日志文件

由于实际生产需要,软件系统的运行,会产生大量的日志文件,有时候一天就能产生超过百万条log记录,那么为了能够处理日志文件,查询并且找到我们想要的报错信息,因此不得不考虑怎么实现,打开大日志文…

excel日期函数篇2

1、DATE(year,month,day):根据年、月、日三个数值返回其表示的日期 2、DATEVALUE(date_text):返回由文本字符串表示的日期的十进制数字 处理时间的时候,如果得到的是字符串格式,要将其转换为日期进行相关操作。excel函数里是使用文…

MinGW编译运行报错RTTI symbol not found for class ‘XXX‘

最近在调试程序时莫名的出现图中报错: 还遇到过for class QObject,在此记录一下,排查后发现,原因都是有资源被重复释放导致的。

intelij idea 2023 创建java web项目

1.点击New Project 2.创建项目名称为helloweb ,jdk版本这里使用8,更高版本也不影响工程创建 点击create 3.新建的工程是空的,点击File-> Project Structure 4.点击Modules 5.点击加号,然后键盘输入web可以搜索到web模块&…

69 # 强制缓存的配置

强制缓存 强制缓存:以后的请求都不需要访问服务器,状态码为 200协商缓存:每次都判断一下,告诉是否需要找缓存,状态码为 304 默认强制缓存,不缓存首页(如果已经断网,那这个页面应该…

Python三行代码实现json转Excel

最近重保,经常需要通过Excel上报威胁事件。安全设备的告警很多都是json格式的,就需要将json转成Excel。 用Python将json转成excel也就三行代码的事,先将json串导入形成字典对象,再通过pandas转成DataFrame直接输出excel。 实现如下…

windows电脑系统自带的画图工具如何实现自由拼图

1.首先选中你要拼接的第一张图片,右键选着编辑,会自动打开自带的画图工具 然后就是打开第一张图片,如下图所示 接着就是将画布托大,如下图所示。 然后点击选择,选择下面的空白区域,选着区域的范围要比准备拼…

智能楼宇综合布线实训室建设方案

一、楼宇智能综合布线实训室方案概述 楼宇智能综合布线实训室方案旨在为学生提供一个真实的学习和实践环境,以培养他们在楼宇智能综合布线领域的实际操作能力和技能。以下是一个概述: 1. 培养目标:培养学生在楼宇智能综合布线方面的综合能力…

耳朵小戴哪种耳机,佩戴舒适度最好的骨传导蓝牙耳机分享

亲爱的小伙伴们!这些精心挑选的骨传导耳机绝对能给你带来全新的耳机体验。告别堵塞的耳道和细菌的困扰,让音乐与你完美融合!不管你是运动爱好者、音乐发烧友还是生活达人,这些骨传导耳机都能满足你的需求。快行动起来,…

Freertos学习

一、概念 实时操作系统,要求一个高的实时性,就不是像在一个死循环中放俩函数了。而是创建俩任务,也叫做俩进程,高速的轮流执行,提高实时性。 二、创建任务

低代码开发ERP:精打细算,聚焦核心投入

企业数字化转型已经成为现代商业环境中的一项关键任务。如今,企业面临着日益激烈的竞争和不断变化的市场需求。在这样的背景下,数字化转型不仅是企业生存的必然选择,也是取得竞争优势和实现可持续发展的关键因素。 在数字化转型的过程中&…

前端对文件转换处理的一些常用方法

文章目录 0,前言1,将图片的url网络链接(http://) 转为base64格式2,将base64的图片数据转换为file文件3,将以base64的图片数据转换为Blob4,将file文件转化为base645,将file文件转换为Blob6,获取文…