【面试干货】事务的并发问题(脏读、不可重复读、幻读)与解决策略
【面试干货】事务的并发问题(脏读、不可重复读、幻读)与解决策略
- 一、脏读(Dirty Read)
- 二、不可重复读(Non-repeatable Read)
- 三、幻读(Phantom Read)
- 四、总结
| 💖The Begin💖点点关注,收藏不迷路💖 |
在数据库管理系统(DBMS)中,事务的并发执行是提高系统性能的关键。然而,并发执行也带来了一系列的问题,如 脏读、不可重复读和幻读。本文将详细解释这些并发问题,并探讨相应的解决策略。
一、脏读(Dirty Read)
1、定义
脏读是指一个事务读取了另一个事务尚未提交的数据。由于被读取的数据可能由于某些原因被回滚,因此该数据是“脏”的,即不可靠 的。
2、示例
假设 事务A读取了事务B尚未提交的对某个数据行的修改,随后事务B发生错误并执行了回滚操作。此时,事务A读取到的数据就是脏数据,因为它已经不再是数据库中的当前状态。
3、解决策略
为了避免脏读,DBMS采用了隔离级别的概念。通过设置不同的隔离级别,可以控制事务之间的可见性。例如,在 可重复读(Repeatable Read)或串行化(Serializable) 隔离级别下,事务只能读取已经提交的数据,从而避免了脏读。
二、不可重复读(Non-repeatable Read)
1、定义
不可重复读 是指在一个事务内,多次读取同一数据,但由于其他事务的修改并提交,导致该事务先后读取到的数据结果不一致。
2、示例
假设事务A两次读取同一数据行,在两次读取之间,事务B修改了该数据行并提交。此时,事务A第二次读取到的数据与前一次不同,即发生了不可重复读。
3、解决策略
为了解决不可重复读问题,DBMS同样采用了隔离级别的概念。在 可重复读(Repeatable Read)或串行化(Serializable) 隔离级别下,事务在开始时会获取一个数据快照,并在整个事务过程中始终基于该快照进行读取操作,从而保证了多次读取结果的一致性。
三、幻读(Phantom Read)
1、定义
幻读 是指在一个事务内,执行相同的查询操作,但由于其他事务的插入或删除操作并提交,导致该事务两次查询到的结果集不一致。
2、示例
假设事务A执行了一个范围查询(如查询年龄大于20且小于30的所有用户),在查询结果返回后,事务B插入了一个年龄为25的新用户并提交。此时,如果事务A再次执行相同的范围查询,会发现新的用户记录“凭空出现”了,即发生了幻读。
3、解决策略
幻读 的解决策略通常依赖于特定的数据库管理系统和隔离级别。在 串行化(Serializable) 隔离级别下,DBMS会 通过加锁等机制来防止其他事务的插入或删除操作,从而避免了幻读。此外,一些数据库管理系统还提供了特定的查询选项或语句来避免幻读。
如: 使用SELECT … FOR UPDATE语句来锁定查询结果集中的所有行。
四、总结
事务的并发执行是数据库管理系统提高性能的重要手段,但同时也带来了一系列并发问题。通过合理设置隔离级别和采用相应的解决策略,我们可以有效地避免脏读、不可重复读和幻读等并发问题,确保数据库的一致性和可靠性。

| 💖The End💖点点关注,收藏不迷路💖 |
相关文章:
【面试干货】事务的并发问题(脏读、不可重复读、幻读)与解决策略
【面试干货】事务的并发问题(脏读、不可重复读、幻读)与解决策略 一、脏读(Dirty Read)二、不可重复读(Non-repeatable Read)三、幻读(Phantom Read)四、总结 💖The Begi…...
函数式接口:现代编程的利器
1. 引言 在软件开发的演进过程中,函数式编程(Functional Programming, FP)逐渐显露头角,成为解决复杂问题的有效工具之一。函数式接口作为函数式编程的核心概念之一,其重要性不言而喻。本文将深入探讨函数式接口的概念…...
2022职称继续教育--深入实施新时代人才强国战略 加快建设世界重要人才中心和创新高地
单选题(共7题,每题5分) 1、()实行职位职级制工资为主。 D、中长线科研重要岗位人员 2、建设世界重要人才中心和创新高地有()个阶段目标。 B、三 3、综合国力竞争说到底是(…...
kube-prometheus-stack 识别 k8s 集群内所有的 ServiceMonitor 和 PrometheusRule
默认情况下,kube-prometheus-stack 只自己创建的 ServiceMonitor,如果 k8s 集群内有多个非 kube-prometheus-stack 创建的 ServiceMonitor,不会被识别到。PrometheusRule 同理。 要识别所有的 ServiceMonitor 和 PrometheusRule ,…...
Android 图片加载glide库 一次通关
前言 Glide是一个由Bumptech开发的开源图片加载库,专门用于Android平台。它被广泛应用于Android应用中,以简化图片加载过程,并提高性能和效率。 Glide能够快速加载图片,同时减少页面加载时间和内存消耗。Glide具有强大的缓存机制…...
Spring OAuth2:开发者的安全盾牌!(上)
何利用Spring OAuth2构建坚不可摧的安全体系?如何使用 OAuth2 从跨域挑战到性能优化,每一个环节都为你的应用保驾护航? 文章目录 Spring OAuth2 详解1. 引言简述OAuth2协议的重要性Spring Framework对OAuth2的支持概述 2. 背景介绍2.1 OAuth2…...
设计模式使用(成本扣除)
前言 名词解释 基础名词 订单金额:用户下单时支付的金额,这个最好理解 产品分成:也就是跟其他人合做以后我方能分到的金额,举个例子,比如用户订单金额是 100 块,我方的分成是 80%,那么也就是…...
输入输出(2)——C++的标准输出流
目录 一、C的标准输出流 (一)cout、cerr和clog流对象 1、cout 流对象 2、cerr 流对象 3、clog流对象 (二)用函数put输出字符 (三)用函数 write 输出字符 一、C的标准输出流 标准输出流——流向标准输…...
C语言序列化和反序列化--TPL(一)
TPL TPL说明网站 C语言中高效的序列化 您可以使用tpl快速轻松地存储和重新加载C数据。Tpl是一个用于序列化C数据的库。数据以自然二进制形式存储。该API很小,并试图保持“不碍事”。Tpl可以序列化许多C数据类型,包括结构。Tpl与文件、内存缓冲区和文件…...
Session + JWT + Cookie
00:HTTP无状态(为了保持状态,前端好麻烦,又要自己存,又要想办法带出去,于是使用cookie) 01:Cookie 将用户信息,在每次请求时候 带给后端(但是自己存储大小有…...
PaddleOCR2.7+Qt5
章节一:Windows 下的 PIP 安装 官网安装教程地址 按照里面的教程去安装 如果使用cuda版本的还要安装tensorrt,不然后面运行demo程序的程序会报如下错。 下载TensorRT 8版本,tensorrt下载地址 章节二:编译源码 进入官网源码地址 下…...
在Android中解析XML文件并在RecyclerView中显示
1. 引言 最近工作有解析外部xml文件在App中显示的需求,特来写篇文章记录一下,方便下次使用。 2. 准备工作 首先,在项目的AndroidManifest.xml文件中添加读取外部存储的权限声明。 <uses-permission android:name"android.permiss…...
Notes for video: EDC-Con 2022/01 - EDC Conceptual Overview and Architecture
Eclipse Dataspace Connector 中文概念 Eclipse Dataspace Connector (EDC) 是一个开源项目,旨在提供一种标准化的方法来连接和共享数据空间中的数据。它是 Eclipse Foundation 下的一个项目,目标是促进数据共享和数据交换的互操作性。以下是 EDC 的一些…...
windows下nginx配置https证书
1、制作证书 1.1 安装工具openSSL。下载地址:http://slproweb.com/products/Win32OpenSSL.html Win64OpenSSL_Light-3_1_0.exe安装(假定安装位置在 d:\openSSL\) 1.2 配置openSSL环境。 新建系统变量OpenSSL值为d:\openSSL\bin,相…...
Llama改进之——RoPE旋转位置编码
引言 旋转位置编码(Rotary Position Embedding, RoPE)将绝对相对位置依赖纳入自注意力机制中,以增强Transformer架构的性能。目前很火的大模型LLaMA、QWen等都应用了旋转位置编码。 之前在[论文笔记]ROFORMER中对旋转位置编码的原始论文进行了解析,重点…...
Python的解析网页
课前案例 通过requests模块爬取指定网站中的图片并保存到本地目录中。 上述案例采用的是同步方式下载图片,效率太低。异步方式如下(线程): # target为目标函数;args中传入的是download函数的参数url threading.Threa…...
VBA技术资料MF159:实现某个区域内的数据滚动
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…...
开源DMS文档管理系统 Nuxeo Vs Alfresco对比及 API 使用概述
1. 文档管理系统是什么 文档管理系统(DMS:Document Management System)是一种软件系统,用于组织、存储、检索和管理电子文档和文件。这些文件可以是各种格式的电子文档,如文本文档、电子表格、图像、音频或视频文件等…...
lambda函数实践
文章目录 1.简单实例2.lambda函数使用3.捕获列表的使用4.lambda表达式的应用1.简单实例 2.lambda函数使用 3.捕获列表的使用 4.lambda表达式的应用 #include <iostream> #include <vector>using namespace std;/** 1.简单实例* 2.lambda函数使用* 3.捕获列表的…...
[leetcode hot 150]第一百九十一题,位1的个数
题目: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中设置位的个数(也被称为汉明重量)。 这道题比较简单,直接对最后一位进行与1的与操作,然…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
