当前位置: 首页 > news >正文

高级java每日一道面试题-2024年9月02日-基础篇-什么是脏读、不可重复读和幻读?

如果有遗漏,评论区告诉我进行补充

面试官: 什么是脏读、不可重复读和幻读?

我回答:

在数据库事务的并发控制中,脏读(Dirty Read)、不可重复读(Non-repeatable Read)和幻读(Phantom Read)是三种常见的并发问题,它们主要涉及到事务的隔离级别和一致性。了解这些问题有助于我们设计更健壮的数据库系统。

1. 脏读(Dirty Read)

  • 定义: 脏读是指一个事务读取到了另一个事务尚未提交的数据。
  • 影响: 如果一个事务读取了另一个未提交事务的数据,然后该事务被回滚,那么第一个事务读取的数据实际上是无效的。这种情况会导致数据的不一致性和不可预测性。脏读违反了数据库的“隔离性”原则。

示例

  • 事务A修改了某行数据,但尚未提交。
  • 事务B读取了事务A修改后的数据。
  • 事务A由于某种原因回滚,撤销了之前的修改。
  • 此时,事务B读取的数据就是“脏”的,因为它读取了从未真正存在的数据。

2. 不可重复读(Non-repeatable Read)

  • 定义: 不可重复读是指一个事务在执行过程中多次读取同一数据时,由于其他事务的并发执行,导致读取结果不一致的现象。
  • 影响: 在同一个事务内,两次或多次查询相同的数据返回了不同的结果。这是因为其他事务在这段时间内对数据进行了修改并提交了这些修改。这通常是因为其他事务修改了数据,但并非所有数据库系统都认为这是问题(取决于其隔离级别)。

示例

  • 事务A两次读取同一数据集合。
  • 在两次读取之间,事务B修改了集合中的某些数据并提交。
  • 因此,事务A的两次读取结果不一致。

3. 幻读(Phantom Read)

  • 定义: 幻读是指一个事务在执行过程中多次读取同一数据集合时,由于其他事务的并发执行,导致数据集合发生变化的现象。
  • 影响: 在同一个事务内,两次或多次查询相同的数据集合返回了不同的结果。这是因为其他事务在这段时间内插入或删除了一些记录。

示例

  • 事务A执行了一个范围查询(如SELECT * FROM table WHERE id > 10)。
  • 在事务A再次执行相同查询之前,事务B插入了新的行(如id = 12)并提交。
  • 当事务A再次执行相同的范围查询时,会发现新的行(id = 12),即出现了“幻读”。

4. 隔离级别

为了解决这些问题,数据库提供了不同的隔离级别,从低到高依次为:

  • 读未提交(Read Uncommitted):允许脏读、不可重复读和幻读。
  • 读已提交(Read Committed):禁止脏读,但允许不可重复读和幻读。
  • 可重复读(Repeatable Read):禁止脏读和不可重复读,但某些数据库(如MySQL的InnoDB引擎)的默认设置可能仍允许幻读。
  • 串行化(Serializable):最高的隔离级别,禁止脏读、不可重复读和幻读。它通过强制事务串行执行来实现,但会影响性能。

理解这些概念对于设计和实现高性能且一致的数据库应用至关重要。在实际开发中,应根据业务需求和性能要求选择合适的事务隔离级别。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2020年ICPC南京站 补题记录
  • Kevin‘s notes about Qt---Episode 2 线程通信
  • 突破编程_C++_设计模式(组合模式)
  • C#知识|加强面向对象编程的认识
  • 2024年【氧化工艺】考试及氧化工艺最新解析
  • docker run的--shm-size是干嘛用的
  • 聊一下Jetpack AppStartUp的使用和原理。
  • ClimODE——使用神经网络ODE 进行天气预报
  • 日志管理与时钟同步
  • 11 Java 方法引用、异常处理、Java接口之函数式编程(接口知识补充Function<T,R>、BiFunction<T, U, R>和自定义泛型接口)
  • 14个中国各朝代地图图源分享
  • YoloV9改进策略:下采样改进|集成GCViT的Downsampler模块实现性能显著提升|即插即用
  • 燃油车淘汰倒计时开始了?
  • 音视频入门基础:WAV专题(8)——FFmpeg源码中计算WAV音频文件AVStream的time_base的实现
  • echarts处理y轴最大小值根据数据动态处理、分割数和是否从0开始
  • #Java异常处理
  • 《Java编程思想》读书笔记-对象导论
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • const let
  • ES6 学习笔记(一)let,const和解构赋值
  • JavaScript 一些 DOM 的知识点
  • overflow: hidden IE7无效
  • Web设计流程优化:网页效果图设计新思路
  • 创建一个Struts2项目maven 方式
  • 关于extract.autodesk.io的一些说明
  • 设计模式走一遍---观察者模式
  • 微信公众号开发小记——5.python微信红包
  • 想写好前端,先练好内功
  • ​ubuntu下安装kvm虚拟机
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #每日一题合集#牛客JZ23-JZ33
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一) storm的集群安装与配置
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Mysql的优化设置
  • (自适应手机端)行业协会机构网站模板
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .htaccess配置常用技巧
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net Core 生成管理员权限的应用程序
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 使用ajax控件后如何调用前端脚本
  • .net 微服务 服务保护 自动重试 Polly
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .net快速开发框架源码分享
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET中使用Redis (二)
  • @antv/g6 业务场景:流程图
  • @Bean, @Component, @Configuration简析
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)