常见的三个事务问题(脏读/幻读/不可重复读)

news2024/11/16 3:39:13

 常见的三个事务问题(脏读/幻读/不可重复读)

脏读

脏读(Dirty Read)是指在一个事务中,读取了另一个未提交事务的数据。

具体来说,脏读的过程如下:

1. 事务A开始,对某一行数据进行了修改,但尚未提交。

2. 事务B在事务A未提交之前,读取了事务A修改的数据。

3. 事务A回滚或提交后,事务B读取的数据可能是不一致的或无效的。

脏读问题的出现是因为事务B读取了尚未完成的事务A的数据,而这些数据可能会在事务A回滚或提交之后发生变化。这种情况下,事务B读取到的数据可能是不正确或无效的,导致脏读问题。

为了避免脏读问题,可以使用较高的事务隔离级别,如READ_COMMITTED、REPEATABLE_READ或SERIALIZABLE。这些隔离级别会确保一个事务只能读取另一个已经提交的事务的数据,避免了脏读问题的发生。但是,较高的隔离级别可能会带来并发性能的下降,需要根据实际情况进行权衡和选择。

不可重复读

不可重复读(Non-repeatable Read)是指在一个事务内,多次读取同一行数据,但在事务执行期间,其他事务对该行数据进行了修改,导致多次读取的结果不一致。

具体来说,不可重复读的过程如下:

1. 事务A开始,读取某一行数据的值。

2. 事务B在事务A未提交之前,对同一行数据进行了修改并提交。

3. 事务A再次读取同一行数据,发现其值已经发生了改变,与第一次读取时的结果不一致。

不可重复读问题的出现是因为读取操作没有锁定数据,而其他事务在事务A执行期间修改了该数据。这种情况下,事务A在多次读取同一数据时,得到的结果可能是不一致的。

为了解决不可重复读问题,可以使用较高的事务隔离级别,如REPEATABLE_READ或SERIALIZABLE。这些隔离级别会对读取的数据进行锁定,防止其他事务对其进行修改,从而保证多次读取的结果一致性。但是,高隔离级别可能会带来并发性能的下降,需要根据实际情况进行权衡和选择。

幻读

幻读(Phantom Read)是指在一个事务中,多次执行同一个查询,但在事务执行期间,其他事务插入或删除了符合该查询条件的数据,导致多次查询的结果不一致。

具体来说,幻读的过程如下:

1. 事务A开始,执行一个查询语句,返回一组数据。

2. 事务B在事务A未提交之前,插入或删除了符合事务A查询条件的数据。

3. 事务A再次执行相同的查询语句,发现返回的数据集发生了变化,出现了新的数据或者缺失了原有的数据。

幻读问题的出现是因为事务A在多次执行相同的查询时,发现结果集的数据量或内容发生了变化,产生了幻觉一样的感觉。这种情况下,事务A无法保证多次查询的结果一致性。

为了解决幻读问题,可以使用较高的事务隔离级别,如REPEATABLE_READ或SERIALIZABLE。这些隔离级别会对查询的数据集进行锁定,防止其他事务对其进行插入或删除,从而保证多次查询的结果一致性。但是,较高的隔离级别可能会带来并发性能的下降,需要根据实际情况进行权衡和选择。此外,使用行级锁或乐观锁等技术也可以一定程度上解决幻读问题。

骚戴理解:简单说就是同样的条件, 第1次和第2次读出来的记录数不一样,例如假设下面的事务A第一次读10条数据,然后其中没有骚戴这条数据,但是事务B在事务执行的时候插入了一条“骚戴”的数据,事务A同样的查询条件再去读的时候发现读出11条数据,其中有“骚戴”这条数据,这就是幻读,这种情况的出现必须要多个事务并发执行才会发生

例子2

时间点

事务A

事务B

1

开启事务

2

开启事务

3

查询数据“骚戴”,不存在

4

插入数据“骚戴”,插入成功

5

提交事务

6

插入数据“骚戴”,插入失败

7

查询数据“骚戴”,查询成功

8

提交事务

骚戴理解:幻读就是事务A查询某条数据的时候不存在,然后在准备添加这条数据的之前又有一个事务B插入了这条数据并提交了事务,所以当事务A添加这条数据添加不成功,因为数据库中已经有了,这就导致事务A查询也查询不到这条数据,添加也添加不了这条数据,最后事务A又查询了一次这条数据,惊奇的发现这条数据最后又的确出现在数据库里,从事务A的角度来看就像出现了幻觉,莫名其妙多了一条数据

不可重复读和幻读的区别

不可重复读和幻读都是数据库事务并发执行时可能出现的问题,但它们的表现和原因略有不同。

  • 不可重复读(Non-repeatable Read)是指在一个事务内,多次读取同一行数据,但在事务执行期间,其他事务对该行数据进行了修改,导致多次读取的结果不一致。不可重复读的问题是由于数据的更新导致的,其他事务对数据进行了修改,导致事务内多次读取的结果不一致。
  • 幻读(Phantom Read)是指在一个事务内,多次执行同一个查询,但在事务执行期间,其他事务插入或删除了符合该查询条件的数据,导致多次查询的结果不一致。幻读的问题是由于数据的插入或删除导致的,其他事务在事务内插入或删除了符合查询条件的数据,导致事务内多次查询的结果不一致。

总结区别如下:

- 不可重复读是由于数据的更新导致的,其他事务对数据进行了修改,导致事务内多次读取的结果不一致。
- 幻读是由于数据的插入或删除导致的,其他事务在事务内插入或删除了符合查询条件的数据,导致事务内多次查询的结果不一致。

为了解决不可重复读问题,可以使用较高的事务隔离级别,如REPEATABLE_READ或SERIALIZABLE。

为了解决幻读问题,可以使用较高的事务隔离级别或者使用行级锁或乐观锁等技术来避免其他事务对数据的插入或删除。需要根据具体的业务需求和并发性能要求来选择合适的解决方案。

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

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

相关文章

C++学习笔记之数组

C学习笔记之数组 https://www.runoob.com/cplusplus/cpp-arrays.html C当中,数组是用于存储固定大小的相同类型元素的顺序集合 数组是整体作为一个变量,其中又包含多个单独变量,作为其元素,如数组变量a,其包含a[0]~a[…

html+css+js网页制作 淘宝首页1个页面带js

htmlcssjs网页制作 淘宝首页1个页面带js 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&…

【并查集、树的直径】P2195 HXY造公园 题解

题意 P2195 codeforces 455c,两道一样的题 给出一个由 n n n 个点, m m m 条边组成的森林,有 q q q 组询问,每次询问有以下两种情况 输入 o p 1 op 1 op1 时:给出点 x x x,输出点 x x x 所在的树的直径。 输…

千元不到,作为可穿戴AI设备,AI Friend真的能够取代手机吗?

在人工智能的浪潮中,我们见证了无数旨在提高效率和生产力的创新设备。 然而,Friend设备以其独特的设计理念,为AI设备带来了新的定义——一个永远在线的伴侣,一个情感的稳定器。 一、Friend的设计理念 Friend设备的设计初衷并非追…

vscode的C/C++环境配置和调试技巧

目录 1.背景 2.下载编译器 3.配置环境变量 4.安装C/C插件 5.写C语言代码并且编译成功 5.1文件操作 5.2对于两个窗口的解释 5.3C语言编译环境配置 6.创建执行文件 7.编译运行过程 8.写其他的代码的解决方案一 9.写其他的代码的解决方案二 10.同时编译多个.c文件 10…

Qt 中实现异步散列器

【写在前面】 在很多工作中,我们需要计算数据或者文件的散列值,例如登录或下载文件。 而在 Qt 中,负责这项工作的类为 QCryptographicHash。 关于 QCryptographicHash: QCryptographicHash 是 Qt 框架中提供的一个用于生成加密散列…

【系统维护】Dll文件修复工具使用教程,Windows系统必备!

一、dll文件是什么 dll文件是是一种Windows操作系统下的可执行文件格式,包含可由多个程序同时使用的代码和数据的文件,它的主要作用是实现代码和数据的共享,从而节省内存和硬盘空间,并提高程序的性能和可维护性 二、如何解决dll文…

刚刚,模糊测试平台SFuzz受到行业认可

近日,中国网络安全产业联盟(CCIA)正式发布了“2024年网络安全优秀创新成果大赛-安全严选专题赛”评选结果,开源网安模糊测试平台SFuzz凭借重大创新能力,得到组委会认可,获本次大赛创新产品优胜奖。 2024年网…

【LeetCode面试150】——392判断子序列

博客昵称:沈小农学编程 作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟! PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在…

数据结构--第八天

--哈希表 -哈希表的概念 哈希表:用散列法存储的线性表被称为哈希表,使用的函数被称为散列函数或者哈希函数,f(k)被称为散列地址或者哈希地址。。通常情况下,散列表的储存空间是一个一维数组,而哈希地址为数组的下标 -哈…

【C# WPF】Style全局样式和资源字典

1.全局样式&#xff1a; 在Window.Resource中声明一个样式&#xff0c;总体为白色&#xff0c;为了更有区分度&#xff0c;采用BasedOn这一继承方式来在保留字体和边缘设置的基础上&#xff0c;更改颜色。 <Window x:Class"WpfApp1.Window1"xmlns"http://s…

LangChain 推出 LangGraph Studio:首款用于可视化、交互和调试复杂代理应用的代理 IDE

嘿&#xff0c;听说了吗&#xff1f;Langchain最近发布了一项重大更新&#xff0c;他们推出了官方Agent IDE&#xff0c;并且免费开放了LangGraph平台。这对于AI开发者来说是个好消息&#xff0c;意味着我们现在有了更强大的工具来构建智能应用。 今天&#xff0c;我们就来分享…

CI/CD——CI持续集成实验

目录 一. 安装Docker 二. 部署Jenkins 三. 配置邮箱 四. Harbor部署 五. Nexus Repository部署 五. sonarqube安装 六. 配置Docker 七. jenkins系统配置sonarqube 八. 配置pipeline 九. 构建并集成 一. 安装Docker docker-ce镜像_docker-ce下载地址_docker-ce安装教程…

HTTP、HTTPS、SOCKS5 三种协议特点详解

一、引言 在当今数字化的世界中&#xff0c;网络通信协议扮演着至关重要的角色。HTTP、HTTPS 和 SOCKS5 是三种常见的网络协议&#xff0c;它们各自具有独特的特点和应用场景。本文将对这三种协议进行详细的分析和比较&#xff0c;帮助您更好地理解它们在网络通信中的作用。 …

vue2+OpenLayers 天地图上打点并且显示相关的信息(2)

上次是在地图上打点 这次鼠标移动在图标上面显示相关的信息 首先有两个事件 鼠标移入 和 鼠标移出事件 pointermove pointerout 鼠标放上去之前 放上去后 代码如下 <template><div class"container"><div id"vue-openlayers" class&quo…

多模态大语言模型(MMLLM)的现状、发展和潜力

1、大模型 随着ChatGPT流行&#xff0c;大模型技术正逐渐成为AI领域的热点。许多行业大佬纷纷投身于这一赛道&#xff0c;展示了大模型的独特魅力和广阔前景。 王慧文&#xff0c;前美团联合创始人&#xff0c;发起“AI英雄帖”。 李志飞&#xff0c;出门问问创始人&#xff0…

7个Agent组成的公司,7分钟完成了一个游戏的开发

来源丨投资实习所&#xff08;ID&#xff1a;startupboy&#xff09; 作者丨StartupBoy 市场对 AI Agent 的期望一直很高&#xff0c;除了各种单向任务的 Agent 外&#xff0c;之前斯坦福大学和 Google 的一项实验已经展示了由 25 个 AI Agent 自行协同运行的虚拟城镇&#x…

如何使用Zoom API创建一个会议?

一、注册一个免费的Zoom账号&#xff08;zoom.us) 二、在Zoom 应用市场&#xff08;App Marketplace)创建一个server to server 的app&#xff0c;授予创建会议的权限。 三、创建一个Zoom API的服务端程序(node.js) 1、git clone https://github.com/zoom/server-to-server-o…

Unity新输入系统 之 InputActions(输入配置文件)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的基本单位Unity新输入系统 之 InputAction&#xff08;输入配置文件最基本的单位&#xff0…

Python-调用pymysql库,执行插入语句

今天写了一个mysql的插入方法&#xff0c;传多条数据时报错: TypeError: not enough arguments for format string 解决:后来排查是因为调用方法是&#xff0c;用的cursor.excute()&#xff0c;导致的报错&#xff0c;改为cursor.excutemany()就插入成功了 方法调用: test.ins…