并行事务会引发的三个问题

news2024/11/28 0:35:11

并行事务是指同时运行多个事务,每个事务独立地执行,并且不会相互影响。在数据库管理系统中,当多个用户同时对同一个数据集进行读取或者写入的时候,使用并行事务可以提高系统的吞吐量和响应时间。同时,由于并行事务可以同时执行多个操作,因此可以极大地提高数据库系统的性能和效率。然而,在使用并行事务时需要考虑并发控制,以避免数据不一致和死锁等问题。

在同时处理多个事务的时候,就可能出现脏读、不可重复读、幻读的问题


1.脏读

脏读(Dirty read)是指一个事务读取了另一个尚未提交的事务的数据,即读取了未经提交的数据。如果该事务随后回滚,则读取的数据就是无效的。脏读是数据库并发控制中一个比较常见的问题。

脏读的产生主要是由于多个事务同时访问数据库中的数据造成的。在并发环境下,为了保证数据的一致性,数据库系统会对事务进行隔离与锁定。但是,如果某个事务读取了另一个事务未提交的数据,那么可能会导致数据的不一致性,也就是脏读的产生。

举个例子,假设有两个事务T1和T2,在执行过程中T1读取了T2正在修改的数据。如果此时T2进行回滚操作,那么T1所读取的数据就是无效的。

脏读不仅会导致数据的不一致性,还会增加数据访问的冲突。因此,数据库的隔离级别可以控制事务能否读取未提交的数据,以及是否需要锁定数据等,以避免脏读的发生。同时,在开发数据库应用程序时,也可以通过代码控制事务的访问行为,避免脏读的产生。


2.不可重复读

不可重复读是指在并发场景下,一个用户在同一事务中多次读取同一行数据,但是在这些读取中得到了不同的结果。

通俗来说,假设用户A在事务T1中多次读取某个数据,而在这几次读取的间隔时间内,另一个用户B完成了一次修改,那么此时用户A再次读取同一行数据时,可能会得到不同的结果。这种情况就是不可重复读。

不可重复读是数据库中的一个并发问题,通常发生在读取未提交的事务隔离级别下。在这种隔离级别下,未提交数据是可见的,并发修改可能会导致数据不一致。

为了避免不可重复读的问题,可以使用更高的事务隔离级别,例如已提交读、可重复读和串行化。在已提交读隔离级别下,不会出现不可重复读的问题;在可重复读和串行化隔离级别下,会对读取的数据进行锁定,避免并发操作的干扰。


 3.幻读

在一个事务内多次查询某个符合查询条件的「记录数量」,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了「幻读」现象。

通常情况下,幻读与不可重复读都是由并发事务引发的,但两者的主要区别在于:

1. 不可重复读针对的是修改操作,而幻读针对的是插入和删除操作。
2. 不可重复读可以通过行级锁或快照读取来解决,而幻读只能通过锁定更多的行来避免。

幻读是由于事务读取的数据范围发生了变化,可能是新增的记录或删除的记录,这些变化在同一事务内无法感知。因此,为了避免幻读,需要在事务中使用锁定更多的行,使读取的数据范围更加准确。

幻读问题主要出现在 Serializable(串行化) 隔离级别下,其他隔离级别也可以出现,但概率较低。解决幻读的方法一般有两种,一种是使用行级锁等数据并发控制技术,另一种是将事务隔离级别调整为 Repeatable Read 或 Serializable。根据具体场景和需求选择合适的方法。

 以上三个现象的严重性排序如下: 

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

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

相关文章

c++学习之继承

目录 一,为什么需要继承 二,继承的基本概念 三,派生类的定义 四,继承中的析构预构造 1,子类中的构造与析构的顺序 2,子类调用成员对象,父类的有参构造 五,子类与父类的同名处理…

防雪崩利器之Hystrix

Hystrix作为一个容错组件,本文从它的作用、熔断设计、工作流程和应用方面一一道来,帮助大家了解如何使用。 1、什么是灾难性雪崩效应 要讲Hystrix,我们就要讲一种场景,在微服务架构中,如果底层服务出现故障&#xff0…

Ubuntu搭建APM固件编译环境

文章目录 前言一、下载源码二、配置编译环境三、编译固件 前言 Ubuntu20.04 APM 4.2.3 参考链接: https://ardupilot.org/dev/docs/building-setup-linux.html 一、下载源码 git clone https://github.com/ArduPilot/ardupilot.git下载完之后 cd ardupilotgit s…

Lecture 18 Information Extraction

目录 Named Entity RecognitionRelation ExtractionOther IE TasksConclusion information extraction Given this: “Brasilia, the Brazilian capital, was founded in 1960.”Obtain this: capital(Brazil, Brasilia)founded(Brasilia, 1960) Main goal: turn text into str…

Linux基本指令详细介绍 【Linux】

文章目录 ls 指令( list directory contents)ls -als -alls -dlls -l (ll)ls -alF文件的类型 : pwd命令(Print Working Directory)cd 命令 (change directory)cd ..cd ~cd - touch指令mkdir指令mkdir -p ( parents) treermdir指令&#xff08…

【数据结构】哈希应用

目录 一、位图 1、位图概念 2、位图实现 2.1、位图结构 2.2、比特位置1 2.3、比特位置0 2.4、检测位图中比特位 3、位图例题 3.1、找到只出现一次的整数 3.2、找到两个文件交集 3.3、找到出现次数不超过2次的所有整数 二、布隆过滤器 1、布隆过滤器提出 2、布隆过…

javaScript蓝桥杯----商城管理系统

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 在商城管理系统中,超级管理员和普通管理员因为权限不同,登录进入后看到的菜单也会是不同的。 本题需要你完成商城管理系统中权限数据的处理。 二、准备 开始答题前,需要先打开本…

2023年,千万不要裸辞....

作为IT行业的大热岗位——软件测试,只要你付出了,就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的,但放眼望去,哪个工作不是这样的呢?会有哪家公司愿意养一些闲人呢?…

硬件设计电源系列文章-LDO基础知识

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示:这里可以添加技术概要 例如: 本文主要开始讲述电源的发展 整体架构流程 提示:这里可以添加技术整体架构 AC/DC转换基础。为什么需要AC需要DC 技术名词解释 提示&#x…

车载测试很难吗?我靠着这套面试资料拿下了16k车载测试offer!

目录 如何写简历 项目经验 如何准备面试 车载项目的实施 常见面试题 总结: 车载测试通常包含以下三个方面: 系统测试:对整车系统进行测试,如车载电子系统、底盘系统、动力系统等。系统测试主要是评估整车各项性能指标是否达到…

STM32单片机(四)第一节:OLED调试工具

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

深入聊一下机械硬盘的相关内容

本文是《数据存储通识课》合集的一部分,本合集希望通过一系列文章科普数据存储相关技术内容。同时,本系列文章不仅仅是科普,还会进行有深度解析,理论结合实现,从代码实现层面进行剖析​ 介绍存储技术当然要从存储技术最基本的组件磁盘开始介绍了。目前市面上我们见得最多的…

shell脚本基础4——function函数、expect

文章目录 一、function函数1.1 函数的定义使用1.2 函数参数1.2.1 脚本内传参1.2.2 脚本外传参 1.3 引用局部变量1.3.1 区分局部变量1.3.2 全局变量在函数外1.3.3 全局变量在函数体1.3.4 函数体直接输出具体值 二、expect命令2.1 常用命令2.2 安装使用2.3 例一2.4 例二2.5 例三 …

Cmake工具的简单使用

引言 本篇文章讲述如何简单的使用cmake工具构建一个项目,帮助入门的c新手学会如何使用cmake. 我们在Clion新创建一个项目时,会发现,除了main.cpp文件之外,还存在一个build-debug目录和一个CMakelists.txt文件,如图: …

Spring Boot 集成 Redisson 实现分布式锁

Redisson 是一种基于 Redis 的 Java 驻留集群的分布式对象和服务库,可以为我们提供丰富的分布式锁和线程安全集合的实现。在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面,例如分布式锁、分布式集合、分布式事件发布和订…

Java学习记录

引入包 把jar包复制到lib下面,然后右键add as library 常用方法 读取文件:FileInputStream获得当前路径:System.getProperty(“user.dir”) 快捷键 https://blog.csdn.net/W_317/article/details/114300373 常用的 生成循环&#xff1…

VMware Workstation 16 安装教程

哈喽,大家好。今天一起学习的是VMware Workstation 16的安装,vm虚拟机是小编非常喜欢的生产力软件,小编之前发布的测试教程钧在vm上进行的实验。 VMware Workstation是一款功能强大的桌面虚拟计算机软件,它能够让用户在宿主机操作…

Coggle 30 Days of ML 打卡任务一:两个赛题数据可视化

Coggle 30 Days of ML 打卡任务一:两个赛题数据可视化 任务一:两个赛题数据可视化 难度/分值:低/1 打卡内容: 参赛选手名称:AppleDoctor完成日期:2023.6.6任务完成情况: 使用的编程语言&…

【你真的会斗图嘛?】Python爬虫实战项目——你想要的图都可以爬到(附安装地址)

目录 一、安装知识(1)Python环境变量(2)Pycharm开发工具(3)requests模块1、安装下载好Pycharm之后,找到终端进行下载requests模块2、输入下载语法:3、此次项目还需用到正则&#xff…

【STM32】制作一个bootloader

工作环境:STM32CubeMXKeil 相关环境准备这里就不介绍了。 bootloader是什么 bootloader就是单片机启动时候运行的一段小程序,这段程序负责单片机固件的更新,也就是单片机选择性的自己给自己下载程序。可以更新,可以不更新&…