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

数据库事务

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

脏读

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

应用场景:假设有两个银行账户,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.mzph.cn/pingmian/39561.shtml

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

相关文章

软考高级-系统分析师知识点100条速记!

宝子们!上半年软考已经结束一段时间了,准备备考下半年软考高级-系统分析师的小伙伴可以开始准备了,毕竟高级科目的难度可是不低的,相信参加过上半年系分的小伙伴深有体会。 这里给大家整理了100条系分知识点,涵盖全书9…

0050__重叠I/O模型

https://blog.51cto.com/u_11146845/6240720

力扣第220题“存在重复元素 III”

在本篇文章中,我们将详细解读力扣第220题“存在重复元素 III”。通过学习本篇文章,读者将掌握如何使用桶排序和滑动窗口来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述…

面试官:你了解git cherry-pick吗

事情要从一次不规范的代码开发开始说起 背景故事 时间 2024年某个风平浪静的周五晚上 地点 中国,北京,西二旗,某互联网大厂会议室 人物 小杰,小A,小B,老K 对话 老K:昨天提交的代码被测试打回来…

[ROS 系列学习教程] 建模与仿真 - 使用 ros_control 控制差速轮式机器人

ROS 系列学习教程(总目录) 本文目录 一、差速轮式机器人二、差速驱动机器人运动学模型三、对外接口3.1 输入接口3.2 输出接口 四、控制器参数五、配置控制器参数六、编写硬件抽象接口七、控制机器人移动八、源码 ros_control 提供了多种控制器,其中 diff_drive_cont…

社科数据整理汇总 - 2

搜索指南:CtrlF 根据关键字搜索,点击标题可直达下载 搜索指南:CtrlF 根据关键字搜索,点击标题可直达下载 搜索指南:CtrlF 根据关键字搜索,点击标题可直达下载 2011-2022年 最新全国省、市、县北京大学数字…

方法的用法

一.简介 目前为止我给出的所有的案例都是将代码放在main方法中,就会产生一些问题: 代码冗长,不利于维护变量过多,想不出那么多的变量名没有重用性 那么该如何解决呢? 我们可以编写功能性的代码块,来被ma…

FormMaking表单设计器V3.8发布,数据表格上线,支持多选、多级表头、列模板自定义、操作列、分页等设置

介绍 FormMaking 是基于Vue的可视化表单设计器,赋能企业实现可视化低代码开发模式;帮助开发者从传统枯燥的表单代码中解放出来,更多关注业务,快速提高效率,节省研发成本。 目前已经在OA系统、考试系统、报表系统、流程…

MyBatis-plus这么好用,不允许还有人不会

你好呀,我是 javapub. 做 Java 的同学都会用到的三件套,Spring、SpringMV、MyBatis。但是由于使用起来配置较多,依赖冲突频发。所有,各路大佬又在这上边做了包装,像我们常用的 SpringBoot、MyBatisPlus。 基于当前要…

报错:RuntimeError_ cuDNN error_ CUDNN_STATUS_EXECUTION_FAILED

原因:pytorch与cuda版本不对 也有可能是内存空间不足,可以更改虚拟空间大小,参考:解决电脑内存不足问题:Win10虚拟内存设置指南

C语言的数据结构:图的操作

🛺图的遍历: 注意:在遍历的过程中,可能会出现 回路 ( 已经访问过的节点还要重新访问一次 ) \color{orange}回路(已经访问过的节点还要重新访问一次) 回路(已经访问过的节点还要重新访问一次). 当从A开始访问时,先访问…

heic格式转化jpg,手把手教你将heic转换成jpg【办公必备】

一、什么是heic heic格式是一种高效的图片格式,它可以在较小的文件大小下提供高质量的图片。 二、如何打开heic 然而,这种图片因其格式的特殊性,在实际应用中仍存在一些问题:压缩效果可能不够理想,一些老旧的软件和设…

[AIGC] HashMap的扩容与缩容:动态调整容量以提高性能

HashMap是Java中常用的数据结构之一,而其性能的优劣与其容量的选择息息相关。本文将详细介绍HashMap的扩容与缩容机制,以及如何动态调整容量以提高性能。 文章目录 一、初始容量和负载因子二、扩容操作三、扩容触发条件四、为什么要扩容?五、…

ubuntu 默认的PATH配置

ubuntu 默认的PATH配置 在Ubuntu系统中,PATH环境变量是非常关键的,因为它定义了操作系统在接收到用户输入命令时,搜索可执行文件的目录顺序。这个变量的配置决定了哪些命令可以被系统全局识别和执行。 默认的PATH配置 Ubuntu的默认PATH环境…

OpenSSH漏洞预警:无需用户交互,可提权至 root

OpenSSH 自 1995 年问世近 20 年来,首次出现了未经验证的远程执行(RCE)漏洞,攻击者可以提权至 root 最高权限,在不需要用户交互的情况下执行任意代码。 OpenSSH 是一套基于 Secure Shell(SSH)协…

stm32学习笔记---USART串口外设(理论部分)

目录 USART简介 USART的框图 串口的引脚 USART的基本结构 数据帧 起始位侦测 数据采样 波特率发生器 USD转串口模块的原理图 声明:本专栏是本人跟着B站江科大的视频的学习过程中记录下来的笔记,我之所以记录下来是为了方便自己日后复习。如果你…

TypeScript 中 const enum 和 enum 的核心区别在哪?日常开发应该使用哪个?

编译结果 enum 会生成一个对象,引用的地方保持对其引用 const enum 会擦除 enum 定义的代码,引用的地方会生成 inline code 使用enum: 使用const enum: PS:编译选项 preserveConstEnums 可以使 const enum 不去擦除 …

WPDRRC信息安全体系架构模型

构建信息安全保障体系框架应包括技术体系、组织机构体系和管理体系等三部分,也就是说:人、管理和技术手段是信息安全架构设计的三大要素,而构成动态的信息与网络安全保障体系框架是实现系统的安全保障。 1.WPDRRC信息安全模型的定义 WPDRRC…

大模型日报 2024-07-02

大模型日报 2024-07-02 大模型资讯 Gemma 2 模型以 27B 的参数击败 70B 的 Llama 3-Instruct,成为开源模型性能第一,在 LMSYS Chatbot Arena 排行表现出色,但微调数据来源引争议。 🔗:http://www.jintiankansha.me/t/g…

Vue3快速上手--3小时掌握

1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n经历了:4800次提交、40个RFC、600次PR、300贡献者官方发版地址:Release v3.0.0 One Piece vuejs/core截止2023年10月,最新的…