什么是脏读、幻读、不可重复读

news2024/12/27 20:54:19

数据库事务

数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全部成功执行,要么全部失败回滚,以保持数据库的一致性和完整性。在多线程或多用户同时操作时,难免会出现错乱与冲突,这就需要引入事务的隔离级别来维持秩序。

脏读

概念阐述:脏读,顾名思义,是指在一个事务中读取到了另一个事务尚未提交的数据。形象地说,就像是你看到了别人还没晾干的衣服——这衣服还可能被拿回去重洗。

应用场景:假设有两个银行账户,A账户有1000元,B账户有500元。现在有两个事务,事务1要从A账户转100元到B账户,事务2要读取A账户的余额。

1、事务1开始,从A账户读取余额(1000元),准备转账。

2、在事务1提交之前,事务2读取A账户的余额,由于事务1尚未提交,事务2读取到的是“脏”数据(即1000元,而实际应扣除100元后为900元)。

3、随后,事务1因某种原因(如检测到错误)回滚,A账户的余额仍然是1000元。

4、此时,事务2基于错误的“脏”数据做了进一步处理,比如打印报表或进行其他计算,导致后续操作出现问题。

优缺点:脏读提高了系统的并发性能,因为数据不必等到事务完全提交才能被读取;但牺牲了数据的准确性,可能导致业务逻辑混乱。

防范措施:设置事务隔离级别为Read Committed(读已提交),可以有效避免脏读。

幻读

概念阐述:幻读发生在范围查询时,一个事务多次执行相同的查询语句,由于其他事务的插入操作,第二次查询的结果集中出现了新的记录,仿佛第一次查询是幻觉。

应用场景:

在一个订单处理系统中,用户A要查询所有未处理的订单以便进行批量处理。

1、用户A开始一个事务,查询所有未处理的订单,得到10条记录。

2、在用户A的事务结束之前,另一个用户B新增了一条未处理的订单,并且用户B的事务已经提交。

3、用户A再次执行相同的查询时,发现现在有11条未处理的订单,与之前查询到的结果不同。

4、如果用户A的批量处理逻辑是基于第一次查询的结果(比如准备处理前10条订单),那么新增的订单(即第11条记录)可能会被遗漏或导致其他问题。

优缺点:幻读保证了数据的实时性,但可能会导致统计不一致,影响决策的准确性。

防范措施:更高的隔离级别,如Serializable(串行化),可以避免幻读,但这会极大降低系统并发能力。

不可重复读

概念阐述:在同一个事务内,多次读取同一数据,因其他事务修改并提交了该数据,导致每次读取的结果不同。如同同一本书,每次翻阅时内容都不一样。

应用场景:

在一个电商系统中,用户A要查询某个商品的库存量以便决定是否购买。

1、用户A开始一个事务,查询商品库存为10件。

2、在用户A的事务结束之前,另一个用户B购买了该商品,库存减少到9件,并且用户B的事务已经提交。

3、用户A再次查询该商品的库存时,发现库存变为了9件,与之前查询到的结果不同。

4、如果用户A基于第一次查询的结果做决策(比如准备购买10件),那么后续操作可能会因为库存不足而失败。

优缺点:增加了数据的动态性,但也可能导致结算或决策失误。

防范措施:Read Committed隔离级别能防止不可重复读,但更严格的Repeatable Read(可重复读)级别是更好的选择。

事务隔离级别的权衡与选择

  • Read Uncommitted(读未提交):最低隔离级别,效率高,但风险大,脏读、不可重复读、幻读都可能发生。

  • Read Committed(读已提交):解决了脏读问题,适合大多数情况,但不可重复读和幻读仍然存在。

  • Repeatable Read(可重复读):避免了不可重复读,MySQL的InnoDB引擎默认此级别,但幻读可能在某些场景下发生。

  • Serializable(串行化):最高级别,彻底避免脏读、不可重复读、幻读,但并发性能极低,仅在极端情况下使用。

实战中的注意事项

  1. 性能与一致性的平衡:根据业务场景选择合适的隔离级别,不要盲目追求最高级别。

  2. 乐观锁与悲观锁:在特定场景下,利用数据库的乐观锁或悲观锁机制,可以辅助解决并发问题,提高数据处理的精细度。

  3. 事务设计:尽量保持事务简短,避免长事务带来的资源锁定问题。

  4. 并发控制策略:合理运用数据库提供的并发控制机制,如MVCC(多版本并发控制)等,减少锁的竞争。

不可重复读和脏读的区别

脏读可以读到其他事务中未提交的数据,而不可重复读是读取到了其他事务已经提交的数据,但前后两次读取的结果不同。

不可重复读和幻读的区别

二者描述的则重点不同,不可重复读描述的侧重点是修改操作,而幻读描述的侧重点是添加和删除操作。

结语

理解脏读、幻读与不可重复读,是数据库领域的一项基本功,也是构建高效稳定应用系统的基础。正如航海者需要掌握识别天气变化的技巧,数据库开发者也需要熟练驾驭事务隔离级别的选择与应用,以确保在数据的汪洋大海中平稳航行。希望本文能成为你探索这片海域的一盏明灯,助你洞察并发控制的奥秘,驾驭复杂,创造更多可能。

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

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

相关文章

零成本、高效率:免费可视化工具的魅力所在

在如今这个数据驱动的时代,免费可视化工具越来越受到人们的欢迎。这些工具不仅降低了数据分析的门槛,还为用户提供了强大的功能和极高的灵活性,使得各行各业的人们都能够轻松地利用数据做出明智的决策。首先,免费可视化工具的零成…

SpringBoot学习06-[SpringBoot与AOP、SpringBoot自定义starter]

SpringBoot自定义starter SpringBoot与AOP SpringBoot与AOP 使用AOP实现用户接口访问日志功能 添加AOP场景启动器 <!--添加AOP场景启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</…

使用Pogo-DroneCAN CANHUB扩展板扩展飞控的CAN口

关键词&#xff1a;Ardupilot&#xff0c;Pixhawk&#xff0c;DroneCAN CANHUB扩展&#xff0c;扩展飞控CAN口 keywords&#xff1a;Ardupilot&#xff0c;Pixhawk&#xff0c;DroneCAN CANHUB Extend 摘要&#xff1a;使用Pogo-DroneCAN CANHUB扩展板扩展飞控CAN口&#xff…

数据挖掘常见算法(分类算法)

K&#xff0d;近邻算法&#xff08;KNN&#xff09; K-近邻分类法的基本思想&#xff1a;通过计算每个训练数据到待分类元组Zu的距离&#xff0c;取和待分类元组距离最近的K个训练数据&#xff0c;K个数据中哪个类别的训练数据占多数&#xff0c;则待分类元组Zu就属于哪个类别…

五分钟了解MQ消息集成

一、MQ消息集成的定义 MQ消息集成是通过消息中间件&#xff08;Message Queue&#xff09;实现的一种数据集成方式。它通过将数据发送到中间件中&#xff0c;再从中间件中接收数据&#xff0c;实现不同系统之间的数据交换。在MQ消息集成中&#xff0c;发送者和接收者之间不需要…

(六)Shader

Shader Shader(着色器)&#xff1a;一种运行在GPU端的类C语言GLSL&#xff0c;用于处理顶点数据以及决定像素片元最终着色。 Shader对三角形数据的处理&#xff0c;分为顶点处理和片元处理&#xff0c;分别称为顶点着色器(Vertex Shader)和片元着色器(Fragment Shader) GLSL …

Ansible 最佳实践:现代 IT 运维的利器

Ansible 最佳实践&#xff1a;现代 IT 运维的利器 Ansible 是一种开源的 IT 自动化工具&#xff0c;通过 SSH 协议实现远程节点和管理节点之间的通信&#xff0c;适用于配置管理、应用程序部署、任务自动化等多个场景。本文将介绍 Ansible 的基本架构、主要功能以及最佳实践&a…

最简单的Qt连接MYSQL的方法

1.报错原因 Qt在某个版本后不在提供编译好的mysql驱动&#xff0c;只在src中提供了驱动源码&#xff0c;使用需要自行编译链接&#xff0c;报错信息如下&#xff1a; QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL Q…

BUT000增强字段BAPI结构激活出错(BUPA_CENTRAL_CI_CHANGE)

导语&#xff1a;BP主数据增强字段&#xff0c;需要使用BAPI&#xff1a;BUPA_CENTRAL_CI_CHANGE进行值写入&#xff0c;但是在SAP 2023以后的版本&#xff0c;激活会出错&#xff0c;原因是因为SAP的一个结构同时包含了BUS00_EEW以及BUS00_EEWX两个结构&#xff0c;导致结构字…

A股低开高走,近3000点,行情要启动了吗?

A股低开高走&#xff0c;近3000点&#xff0c;行情要启动了吗&#xff1f; 今天的A股&#xff0c;让人瞪目结舌了&#xff0c;你们知道是为什么吗&#xff1f;盘面上出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市低开高走&#xff0c;银行板块护盘指数&…

教你如何在群晖上部署m3u8视频下载工具,支持浏览器一键添加下载任务

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 快速开始📝 群晖部署📝 部署浏览器一键添加任务🎈 常见问题 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 在当今数字化时代,视频内容的下载和管理变得越来越重要。尤其是对于那些使用群晖NAS设备的用户,一…

Android Studio 解决AAPT: error: file failed to compile

1.找到项目下的build.gradle 2.在android语块中添加下面代码 aaptOptions.cruncherEnabled false aaptOptions.useNewCruncher false 12

scratch宇航员太空漫游 2024年6月中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析

目录 scratch宇航员太空漫游 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、 推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程…

如何使用AI学习一门编程语言?

无论你是软件开发新手还是拥有几十年的丰富经验&#xff0c;总是需要学习新知识。TIOBE Index追踪50种最受欢迎的编程语言&#xff0c;许多生态系统为职业发展和横向转型提供了机会。鉴于现有技术具有的广度&#xff0c;抽空学习一项新技能并有效运用技能可能困难重重。 最近我…

四川财谷通抖音小店,诚信经营

在当下这个数字化、网络化的时代&#xff0c;电商平台的兴起极大地改变了人们的购物习惯。抖音小店作为新兴电商模式的代表&#xff0c;凭借其短视频、直播等互动性强、传播速度快的特点&#xff0c;吸引了大量消费者和商家的目光。四川财谷通抖音小店&#xff0c;正是其中一颗…

手把手教你搭建PyTorch环境:MindStudio中PyTorch模型开发实战

本次实验的视频链接如下&#xff1a;​https://www.bilibili.com/video/BV1iA4y1f7o1/ 本次实验在MindStudio上进行&#xff0c;请先按照 教程 配置环境,安装MindStudio。 ​ MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台&#xff0c;该IDE上功能很多…

ruoyi—cloud 新建模块+生成代码

1.复制一个模块——修改名字 2.打开模块下的yml文件&#xff0c;修改端口号和名字 &#xff08;1&#xff09;修改一个名字 &#xff08;2&#xff09;打开yml文件 &#xff08;3&#xff09;修改端口号&#xff0c;不要重复 &#xff08;4&#xff09;改名字和模块一致 3.…

滑动窗口算法系列|基础概念|例题讲解

大家好,我是LvZi,今天带来滑动窗口算法系列|基础概念|例题讲解 一.滑动窗口问题基础概念 滑动窗口本质上是同向双指针问题,脱胎于双指针.使用两个指针l, r维护一定长度的数组区间,在r 指针遍历的过程中,执行进窗口,判断,更新结果,出窗口 等操作,当r指针遍历完毕,就能得到最后…

Centos安装1Panel面板工具安装可视化界面

1Panel是一种市场调研平台&#xff0c;旨在帮助企业进行市场研究和获取消费者反馈。它通过在线调查和观察研究的方式&#xff0c;帮助企业了解他们的目标市场&#xff0c;并针对市场需求做出相应的决策。 1Panel的特点包括&#xff1a; 1. 全球范围&#xff1a;1Panel在全球范…

计算机网络-第5章运输层

5.1运输层协议概述 5.1.1进程之间的通信 运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 通信的两端应当是两个主机中的应用进程。 运输层复用和分用&#xff1a;复用指在发送方不同的应用进程都可以…