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

数据库事务

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

脏读

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

应用场景:假设有两个银行账户,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(多版本并发控制)等,减少锁的竞争。

不可重复读和脏读的区别

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

不可重复读和幻读的区别

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

结语

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C# winForm】ProgressBar进度条

1.控件介绍 进度条通常用于显示代码的执行进程进度,在一些复杂功能交互体验时告知用户进程还在继续。 在属性栏中,有三个值常用: Value表示当前值,Minimum表示进度条范围下限,Maximum表示进度条范围上限。 2.简单实…

【产品经理】订单处理12-订单的取消与反取消

在电商ERP系统中,订单取消与反取消也是常见功能之一。 订单取消与反取消也是电商ERP系统的常见功能,本次主要讲解下订单取消与反取消的逻辑。 一、订单取消 在电商ERP系统中,订单取消一般由审单员操作,此类取消一般是由于上下游…

商家团购app微信小程序模板

手机微信商家团购小程序页面,商家订餐外卖小程序前端模板下载。包含:团购主页、购物车订餐页面、我的订单、个人主页等。 商家团购app微信小程序模板

sublime如何运行Html文件?

背景: 在sublime上面写了html代码以后,怎么运行html文件来进行debug呢?如果去点击保存的HTML文件,每次这样就会很麻烦,能不能直接在sublime里面点什么就可以直接打开浏览器运行呢?答案是OK的。 1-确认Vie…

Android面试题经典之Glide取消加载以及线程池优化

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 Glide通过生命周期取消加载 生命周期回调过程 onStop —>RequestManager.onStop –>RequestTracker.pauseRequest –> SingleRequest…

SpringSecurity6 | 基于数据库实现登录认证

SpringSecurity6 | 基于数据库认证 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 基于数据库实现登…

Cell | 泛癌蛋白基因组学分析,揭示癌症治疗靶点(章冰/高强)

– DOI: 10.1016/j.cell.2024.05.039 Pan-cancer proteogenomics expands the landscape of therapeutic targets 留意最新动态,请关注微信公众号:组学之心 最近课题组在写泛癌的综述,刚好这篇相关研究论文在6.24发表,新鲜出炉…

Toshiba东芝TB6612FNG电机驱动IC:释放性能与多功能性

在嵌入式系统和机器人技术领域,电机控制是一个关键方面,对项目的性能和可靠性有着显著影响。东芝的TB6612FNG电机驱动IC作为一个稳健且多功能的解决方案,在驱动双直流电机方面脱颖而出,提供了高性能、可靠性和易用性。本文将深入探…

Java [ 基础 ] 异常处理 ✨

✨探索Java基础 异常处理✨ 在Java编程中,异常处理是一个非常重要的概念,它有助于在程序运行时捕获和处理错误,从而使程序更加健壮和可靠。 本文将介绍Java中的异常基础知识、异常类型、异常处理机制以及最佳实践。 一、什么是异常&#…

SQL语句的案例分析

根据提供的图片内容,这段文字看起来像是一个SQL查询的一部分,特别是一个用于删除数据的语句。以下是对这段SQL的核心内容整理: ### 核心内容整理: 1. **删除操作**: - 使用DELETE语句来删除数据。 2. **子查询**…

惠海 H6900B 2.7V3.7V4.2V5V9V升12V24V48VLED升压恒流芯片IC

惠海H6900B LED升压恒流芯片IC是一款功能丰富的LED驱动解决方案,为高亮度LED灯串设计。以下是针对该产品的进一步分析和解释: 产品特点 高效率:高达95%以上的效率意味着在驱动LED时,只有很少的能量转化为热量,从而提…

轨迹规划 | 图解模型预测控制MPC算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 模型预测控制原理2 差速模型运动学3 基于差速模型的MPC控制4 仿真实现4.1 ROS C实现4.2 Python实现4.3 Matlab实现 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、…

“论单元测试方法及应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 1、概要叙述你参与管理和开发的软件项目,以吸你所担的主要工作。 2、结给你参与管理和开发的软件项目,简要叙述单元测试中静态测试和动态测试方法的基本内容。 3、结给你惨与管理和研发的软件项目,体阐述在玩测试过程中,如何确定白盒测试的覆盖标准,及如…

YOLO在目标检测与视频轨迹追踪中的应用

YOLO在目标检测与视频轨迹追踪中的应用 引言 在计算机视觉领域,目标检测与视频轨迹追踪是两个至关重要的研究方向。随着深度学习技术的飞速发展,尤其是卷积神经网络(CNN)的广泛应用,目标检测与视频轨迹追踪的性能得到…

WAIC | 斯梅尔数学与计算研究院邀您莅临WAIC 2024“数学与人工智能”论坛

当我们谈论起人工智能这一变革性力量时,就不得不提及数学。人工智能作为当今社会的热门话题,从AlphaGo到ChatGPT,从智能制造到数字文旅,它的发展和应用深刻地影响着行业和人们的生活。然而,人工智能的发展和基础离不开…

怎么把视频字幕提取出来?一招教你提取视频字幕

想必大家一定很有同感吧,视频已成为我们获取知识与新闻的主要渠道。 面对如此众多的视频资源,如何迅速筛选出核心信息并进行有效管理,成为了一项迫切需要解决的问题。 视频字幕提取翻译软件的问世,利用尖端的语音识别技术&#…

Kimi 上下文缓存功能开启公测!降低使用费用,加快模型相应速度

7月2日,系统之家发布消息,月之暗面科技有限公司旗下的Kimi开放平台正式推出上下文缓存功能,并已开放公测。这项功能专为处理频繁请求和大量重复引用初始上下文的场景设计,能有效降低使用长文本模型的成本,并显著提升处…

森林防火气象站:守护森林安全的科技利器

在广袤无垠的森林中,火灾一直是威胁森林生态安全的重要因素。为了有效预防和控制森林火灾,科学家们不断研发新技术,而森林防火气象站正是这一领域的重要成果之一。其中,森林防火气象站凭借其强大的功能和独特的设计,在…

laravel对接百度智能云 实现智能机器人

创建API Key和 Secret Key进入网址:百度智能云千帆大模型平台 如下图操作: 填写完毕点击确认后,即可得到sk和ak 后端接口实现代码: //调用百度智能云第三方机器人接口public function run($text) {$curl curl_init();curl_setop…

【基于R语言群体遗传学】-2-模拟基因型(simulating genotypes)

书接上文,我们昨天讨论了遗传的哈代温伯格比例: 【基于R语言群体遗传学】-1-哈代温伯格基因型比例-CSDN博客 接下来,如果我们能够模拟一个过程并观察模拟结果与我们预期的是否相符,这通常有助于指导我们对这个过程的直观感觉。让…