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

数据库事务

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

脏读

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

应用场景:假设有两个银行账户,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…

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

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

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

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

方法的用法

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

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

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

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

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

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

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

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

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

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…

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月,最新的…

llama-factory训练RLHF-PPO模型

理论上RLHF(强化学习)效果比sft好,也更难训练。ppo有采用阶段,步骤比较多,训练速度很慢. 记录下工作中使用llama-factory调试rlhf-ppo算法流程及参数配置,希望对大家有所帮助. llama-factory版本: 0.8.2 一 rlhf流程 ppo训练流程图如下, 会…

【Kubernetes】加入节点Node及问题

命令 分别再node节点机器上,执行如下命令: kubeadm join [master机器ip:端口] --token [master机器初始化生成的token] --discovery-token-ca-cent-hash [master机器初始化生成的hash]问题 由于清屏没有记住token和hash的时候: 1&#xff…

Log4j日志框架讲解(全面,详细)

Log4j概述 Log4j是Apache下的一款开源的日志框架,通过在项目中使用 Log4J,我们可以控制日志信息输出到控制台、文件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以 更灵活的控制日志的输出过程…

如何指定Microsoft Print To PDF的输出路径

在上一篇文章中,介绍了三种将文件转换为PDF的方式。默认情况下,在Microsoft Print To PDF的首选项里,是看不到输出路径的设置的。 需要一点小小的手段。 运行输入 control 打开控制面板,选择硬件和声音下的查看设备和打印机 找到…

【ubuntu18.04】 局域网唤醒 wakeonlan

ai服务器经常因为断电,无法重启,当然可以设置bios 来电启动。 这里使用局域网唤醒配置。 自动开关机设置 工具:ethtool 端口 : enp4s0 Wake-on: d 表示禁用Wake-on: g 激活 ,例如:ethtool -s eth0 wol g 配置/etc/rc.local ,这个文件不存在,自己创建工具下载 tengxun W…

【前端vue3】TypeScrip-类型推论和类型别名

类型推论 TypeScript里,在有些没有明确指出类型的地方,类型推论会帮助提供类型。 例如: 变量xiaoc被推断类型为string 如重新给xiaoc赋值数字会报错 let xiaoc "xiaoc"xiaoc 1111111111111如没有给变量指定类型和赋值&#xf…

专题七:Spring源码之BeanDefinition

上一篇我们通过refresh方法中的第二个核心方法obtainBeanFactory,通过createBeanFacotry创建容Spring的初级容器,并定义了容器的两个核心参数是否允许循环引用和覆盖。现在容器有了,我们来看看容器里的第一个重要成员BeanDefinition。 进入lo…

从需求是如何最终抽象成最基本的传参入参

第一层:出参和入参 用通俗的话讲,就是给客户提供服务的一种方式,需要包含入参和出参 。入口参数就是程序执行时会调用的参数,出口参数就是程序执行完会返回的参数。入参的值是被调函数需要, 出参的值是主调函数需要的…