数据库事务中的四大问题:脏读、脏写、不可重复读与幻读详解

数据库事务中的四大问题:脏读、脏写、不可重复读与幻读详解

什么是脏读

定义

事务B读取数据时,读取到的是事务A更新之后,但还未提交的数据。

事务A修改了一条数据,但是还没有提交时,事务B查询到了这条未提交的数据,事务B对这条数据进行一系列业务逻辑操作之后,但事务A因为还没有提交,所以可以随时回滚,这就导致在事务A回滚后,事务B所读取的数据,和实际数据不一致,这种情况就叫脏读。

举例

此时有条数据id为1的数据的balance为 “0” ,事务A要加500,便将其balance更新为 “500”,但在事务A还未提交时,事务B查询了这条数据,得到的是balance为 “500”,然后做了一系列操作之后,事务A回滚了,balance回滚为 “0” ,导致事务B的针对balance为 “500” 做的一系列操作都是白费。

什么是脏写

定义

两个事务同时更新同一条数据时,一个事务A更新数据的是另一个事务B还未提交的数据,此时事务B是可以回滚的,事务B回滚了就会导致出现数据不一致问题。

举例

此时有条数据id为1的数据的balance为 “0” ,事务A要加500,便将其balance更新为 “500” ,
但在事务A还未提交时,事务B要将其加100,就又将其balance更新为 “600” ,并提交了,
此时id为1的数据的balance属性值是 “600” 。
但事务A还没有提交,这就存在一个问题,事务A此时是可以回滚的,并且事务A回滚时,是将其回滚为 “0” 的。
(因为事务A更新数据时,是记录更新前的数据 “0” 到undo日志里)
这就导致事务B的数据更新是更新了个寂寞,这种情况就叫脏写。

什么是不可重复读

定义

在同一个事务中,两次读取同一条数据,因为受到其他事务的影响,而出现两次的结果不一致的情况,就叫不可重复读。

举例

此时有条数据id为1的数据的balance为 “0” ,事务B读取这条数据,获取到balance为 “0”,然后去做其他业务操作,但事务还未结束时。事务A要将其更新为500,便将其balance更新为 “500” 。此时如果事务B再次查询这条数据,则会发现他的数据是balance为 “500”,前后两次查询的结果不一致,这种情况就叫不可重复读。

请添加图片描述

幻读

定义

在同一个事务中,用同样的查询SQL语句,多次去执行,每次会发现查到一些之前没看到过的数据,此时就是幻读。

举例

事务B要查询表中所有balance大于 “0” 的数据,第一次查询,发现没有符合条件的数据,此时事务B还没有结束,然后事务A横插一脚,将其中一条数据的的balance更新为了 “500”。事务B再次查询时,就会发现有符合条件balance大于 “0” 的数据了,此时就说明事务B出现了幻读。

请添加图片描述

怎么处理避免这些情况呢?

处理的方式有:加锁、事务隔离、MVCC。

方案一:加锁

想对锁进一步了解可以参考文章 《 MySQL锁机制揭秘:从行锁到表锁,共享锁到排他锁,悲观锁到乐观锁的全面解读 》

针对脏读/脏写/不可重复读

在读取数据时添加共享锁,读取完之后释放共享锁。在更新数据时添加排他锁,事务结束时释放排他锁。

因为加了排他锁,是无法再加共享锁的,也就是存在事务进行写操作的情况下,其他事务不能进行读操作。

而加了共享锁,也是不能再加排他锁的,也就是存在事务进行读操作的情况下,其他事务不能进行写操作。

这样就有效的避免了脏读和脏写的情况。

但是加锁和释放锁的操作会牺牲性能。

针对幻读

针对在多次查询同一个范围数据,得到了之前没有出现的数据这种情况,可以使用加范围锁(间隙锁)去解决。直接锁定这一区间范围的数据,不允许其他事务进行操作,知道本事务结束,释放范围锁(间隙锁)。

方案二:事务隔离

1、未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他事务中更新了,但是还没有提交的数据。

2、提交读(Read Committed):只能读取到已经提交的数据。

3、可重复读(Repeated Read):在同一个事务内,同一查询语句经过多次执行,得到的结果都会和事务第一次指定的查询结果保持一致。这个事务隔离级别是InnoDB的默认隔离级别。

在SQL标准中,这个隔离级别解决了不可重复读问题,但是还会存在幻读情况,但是InnoDB为了解决幻读引入的一种锁机制,叫间隙锁。

4、串行读(Serializable):完全串行化的读,每次读数据都需要获得表级共享锁,读写相互都会阻塞。是一种性能很低的隔离级别。

方案三:MVCC

通过多版本并发控制机制的undo日志和ReadView机制来解决这些问题。
后续会专门写一篇关于MVCC的文章。

关注我,我将持续输出Java常用相关技术文章。
请添加图片描述

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

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

相关文章

AI基础 L22 Uncertainty over Time I 时间的不确定性

Time and Uncertainty 1 Time and Uncertainty States and Observations • discrete-time models: we view the world as a series of snapshots or time slices • the time interval ∆ between slices, we assume to be the same for every interval • Xt: denotes the se…

【初阶数据结构】排序

目录 一、排序的概念及其运用 1.1排序的概念 1.2常见的排序算法 二、常见排序算法的实现 2 .1插入排序 2 .1.1基本思想: 2.1.2直接插入排序: 算法复杂度: 最坏情况: 最好的情况: 直接插入排序的特性总结&…

Unity实战案例全解析:PVZ 植物放置分析

前篇:Unity实战案例全解析:PVZ 植物卡片状态分析-CSDN博客 植物应该如何从卡牌状态转为实物? 其实就只需要考虑两个步骤加一个后续处理: 1.点击卡牌后就实例化 需要一个植物状态枚举,因为卡牌分为拿在手上和种植下…

大众点评代发收录

大众点评代发收录 大众点评的代运营到底靠谱不靠谱?擦亮你的眼睛,别再被割韭菜了。#代运营 #永善 #干货分享 #大众点评运营 #美团运营 你的网站被百度搜录了吗?普京说过,给我 20 年,还你一个强大的俄罗斯。那么狂潮老…

SAP HCM HR_ABS_ATT_TIMES_AT_ENTRY 跨夜班不生效问题

导读 跨夜班标准函数不生效:今天客户提出一个问题,计算请假时长不生效的问题(微信小程序调用SAP接口),但是在PA30中能正确计算,所以问题肯定就是在调用标准函数的时候,参数设置问题&#xff0c…

20Kg载重30分钟续航多旋翼无人机技术详解

一、机架与结构设计 1. 材料选择:为了确保无人机能够承载20Kg的负载,同时实现30分钟的续航,其机架材料需选用轻质高强度的材料,如碳纤维或铝合金。这些材料不仅具有良好的承重能力,还能有效减轻无人机的整体重量&…

【linux基础】linux中的开发工具(4)--调试器gdb的使用

目录 前言一,背景二,gdb的使用1. 启动 gdb 调试器:2. 罗列代码信息3. 运行程序4. 有关断点的操作(1) 打断点(2) 查看断点(3) 删除断点(4) 在一次调试中,断点是递增的(5) 关闭断点(6) 开启断点(7) 逐过程调试,相当于 F1…

Redis模拟消息队列实现异步秒杀

目录 一、消息队列含义 二、Redis实现消息队列 1、基于List的结构模拟实现消息队列 2、基于PubSub的消息队列 3、基于Stream的消息队列 4、基于Stream的消息队列- 消费者组 一、消息队列含义 消息队列(Message Queue),字面意思就是存放…

MyBatis中一对多关系的两种处理方法

目录 1.多表联查(通过collection标签的ofType属性) 1)mapper 2)mapper.xml 3)测试代码 4)测试结果 2.分布查询(通过collection标签的select属性) 1)mapper 2)mapper.xml 3&#xff0…

优化算法(三)—模拟退火算法(附MATLAB程序)

模拟退火算法(Simulated Annealing, SA)是一种基于概率的优化算法,旨在寻找全局最优解。该算法模拟金属退火过程中的物质冷却过程,逐渐降低系统的“温度”以达到全局优化的效果。它特别适用于解决复杂的组合优化问题。 一、模拟退…

[产品管理-21]:NPDP新产品开发 - 19 - 产品设计与开发工具 - 详细设计与规格定义

目录 前言: 一、详细设计与规格定义概述 1、产品详细设计 2、规格定义 3、详细设计与规格定义的关系 4、实际应用中的注意事项 二、详细设计与规格定义主要工具 2.1 质量功能展开QFD - 需求跟踪矩阵 1、QFD的基本原理 2、QFD的实施步骤 3、QFD的优势与应…

人工智能开发实战matplotlib库应用基础

内容导读 matplotlib简介绘制直方图绘制撒点图 一、matplotlib简介 matplotlib是一个Python 2D绘图库,它以多种硬拷贝格式和跨平台的交互式环境生成高质量的图形。 matplotlib 尝试使容易的事情变得更容易,使困难的事情变得可能。 我们只需几行代码…

解锁全球机遇:澳大利亚服务器租用市场的独特魅力

在浩瀚的全球数字版图中,澳大利亚以其独特的地理位置、丰富的资源禀赋、以及日益增长的数字经济活力,成为了众多互联网企业竞相布局的重要市场。特别是当谈及服务器租用这一关键环节时,澳大利亚以其稳定的网络环境、先进的基础设施和开放的市…

[数据集][目标检测]智慧交通铁路异物入侵检测数据集VOC+YOLO格式802张7类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):802 标注数量(xml文件个数):802 标注数量(txt文件个数):802 标注类别…

知识竞赛活动舞台搭建要多少钱

每次举办活动,舞台搭建总是让人头疼的一部分,尤其是费用问题。今天就来揭开活动舞台搭建费用的神秘面纱。 活动舞台搭建的费用主要包括舞台结构、设备、音响、灯光、舞美装饰等各方面的成本。具体来说: 1.舞台结构:包括舞台平台…

5.TensorBoard的使用(二)--add_image()

TensorBoard的使用(二) 1.使用add_image()给添加图片 首先导入Tensorboard包 from torch.utils.tensorboard import SummaryWriter创建一个SummaryWriter类的实例,并将所有的事件文件保存在logs文件夹中 writer SummaryWriter(logs)使用add…

完整版订单超时自动取消功能

前几天对实习还是继续学习技术产生了抉择,问了一个前辈,他抛给我一个问题,怎么做15分钟订单自动取消,我说然后到时间之后,自动执行这个订单关闭业务,比如把锁了的库存给解开等等操作,然后在数据…

【算法篇】哈希类(笔记)

目录 一、常见的三种哈希结构 二、LeetCode 练习 1. 有效的字母异位词 2. 两个数组的交集 3. 快乐数 4. 两数之和 5. 四数相加II 6. 赎金信 7. 三数之和 8. 四数之和 一、常见的三种哈希结构 当想使用哈希法来解决问题的时候,一般会选择如下三种数据…

4.接口测试基础(Jmter工具/场景二:一个项目由多个人负责接口测试,我只负责其中三个模块,协同)

一、场景二:一个项目由多个人负责接口测试,我只负责其中三个模块,协同 1.什么是测试片段? 1)就相当于只是项目的一部分用例,不能单独运行,必须要和控制器(include,模块)一…

C++——哈希unordered_set/unordered_map的封装

目录 前言 二、unordered_set的封装 1.模板参数列表的改造 2. 增加迭代器操作 3. 模板参数的意义 三、unordered_map的封装 1、“轮子所需要的参数 2、迭代器 四、完整代码 1、HashTable 2、unordered_set 3、unordered_map 总结 前言 unordered_set和map的介绍在上一篇博客有…