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

news2024/11/15 7:25:08

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

什么是脏读

定义

事务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.coloradmin.cn/o/2139415.html

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

相关文章

火语言RPA流程组件介绍--下拉框选择

🚩【组件功能】:勾选下拉框选项 配置预览 配置说明 丨目标元素 支持T或# 默认FLOW输入项 通过自动捕获工具捕获(选择元素工具使用方法)或手动填写网页元素的css,xpath,指定对应网页元素作为操作目标 丨值 支持T或# 选中目标的值&#xf…

Leetcode 第 413 场周赛题解

Leetcode 第 413 场周赛题解 Leetcode 第 413 场周赛题解题目1:3274. 检查棋盘方格颜色是否相同思路代码复杂度分析 题目2:3275. 第 K 近障碍物查询思路代码复杂度分析 题目3:3276. 选择矩阵中单元格的最大得分思路代码复杂度分析 题目4&…

【SpringCloud】Spring Cloud 开发环境搭建与基础工程构建

目录 环境和工程搭建开发环境安装JDKJDK版本介绍JDK17安装WindowsLinux - UbuntuLinux - CentOs MySQL安装UbuntuCentOS 案例介绍需求服务拆分服务拆分原则服务拆分示例 数据准备工程搭建构建父子工程创建父工程DependencyManagement 和 DependenciesSpring Cloud版本 创建子项…

【生日视频制作】奔驰梅赛德斯大奔提车交车仪式感视频拍照AE模板修改文字软件一键生成器教程特效素材【AE模板】

生日视频制作教程奔驰梅赛德斯大奔提车交车仪式感视频拍照AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓: 怎么如何做的【生日视频制作】奔驰梅赛德斯大奔提车交车仪式感视频拍照AE模板修改文字软件一键生成器教程特效素材【AE模…

下一代 AI 搜索:多智能体 + 系统2,解决 AI 搜索在复杂信息性能下降问题

下一代 AI 搜索:多智能体 系统2,解决 AI 搜索在复杂信息性能下降问题 AI 搜索:从搜索引擎到答案引擎① AI 搜索市场现状(可跳过)② 巨好用的 AI 工具推荐程序员的垂直搜索引擎 devv.ai ③ 多智能体 系统2&#xff0c…

易扫功能介绍

背景 之前开发扫描工具,在大家使用过程中提出了很多改进建议,其中最多的就是,IP地址变动,导致无法扫描。易扫软件系统解决了这个问题,同时易扫服务端,支持多操作系统平台安装。 系统架构 主要功能介绍 支…

字典+泛型的栈与队列+委托

字典 在System.Collections.Generic下&#xff0c;对应HashTable,添加了泛型的特性&#xff0c;性能更高更安全&#xff0c;在内存中散列排布&#xff0c;存储也是键值对。 Dictionary<键的数据类型&#xff0c;值的数据类型> 字典名new Dictionary<键的数据类型&am…

18063 圈中的游戏

### 思路 1. 创建一个循环链表表示围成一圈的 n 个人。 2. 从第一个人开始报数&#xff0c;每报到 3 的人退出圈子。 3. 重复上述过程&#xff0c;直到只剩下一个人。 4. 输出最后留下的人的编号。 ### 伪代码 1. 创建一个循环链表&#xff0c;节点表示每个人的编号。 2. 初始…

【视觉中国-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

TCP Analysis Flags 之 TCP ZeroWindow

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

9. 什么是 Beam Search?深入理解模型生成策略

是不是总感觉很熟悉&#xff1f; 在之前第5&#xff0c;7&#xff0c;8篇文章中&#xff0c;我们都曾经用到过与它相关的参数&#xff0c;而对于早就有着实操经验的同学们&#xff0c;想必见到的更多。这篇文章将从示例到数学原理和代码带你进行理解。 Beam Search 对应的中文翻…

工厂模式(一):简单工厂模式

一、概念 顾名思义&#xff0c;带着工厂&#xff0c;两字肯定就是有标准、快速、统一等等一些工厂独有的特点。 那么什么是简单工厂模式呢&#xff1f; 定义&#xff1a;简单工厂模式是一种创建对象的设计模式&#xff0c;它定义了一个工厂类通过某个静态方法来生成不同类型的…

基于AutoDL部署langchain-chatchat-0.3.1实战

一、租用AutoDL云服务器&#xff0c;配置环境 1.1 配置AutoDL环境 注册好autodl账户之后&#xff0c;开始在上面租服务器&#xff0c;GPU我选择的是RTX4090*2&#xff0c;西北B区&#xff0c;基础镜像选择的是Pytorch-2.3.0-python-3.12&#xff08;ubuntu22.04&#xff09;-…

夸克网盘电脑端和手机端如何查看自己分享的文件

夸克网盘有些地方做的还是有点抽象&#xff0c;好多东西是真的找不到。 找了半天终于找到了自己分享的文件&#xff0c;给大家分享下。 电脑端 点击左侧栏的“快传”&#xff0c;然后点击“我分享的” 手机端 手机端也是类似&#xff0c;点击“快传”后再点击“我分享的”&a…

白月光git

感觉bug好多干脆直接从头到脚梳理 感冒不嘻嘻 近况是&#xff1a; 早起学习 开车去沟里 把蜜蜂拍到狗身上 把车开回来 吃席 安装git和VScode 都是从官网上装的&#xff0c;不说那么多咯&#xff0c;之前说过&#xff1a; 进程间也要唠一唠-CSDN博客https://blog.csdn.net…

Spring4-IoC3-手写IoC

Spring框架的IoC是基于Java反射机制实现的 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;这种动态获取信息以及动态调用对象方法的功…

【AI学习笔记】初学机器学习西瓜书的知识点概要记录

初学机器学习西瓜书的知识点概要记录 1.1 机器学习1.2 典型的机器学习过程1.2 机器学习理论1.3 基本术语1.4 归纳偏好1.5 NFL定理2.1 泛化能力2.2 过拟合和欠拟合2.3 三大问题2.4 评估方法2.5 调参与验证集2.6 性能度量2.7 比较检验 以下内容出自周志华老师亲讲西瓜书 1.1 机器…

复习:数组

目录 数组名 一般性理解 下标引用与间接访问 例外 一维数组 声明与初始化 下标引用 内存分配 长度计算 二维数组 内存分配 长度计算 声明与初始化 数组指针 引入 数组指针 一级指针 引入 一级指针 章尾问题 数组名 一般性理解 数组名是一个指向&#x…

DockerLinux安装DockerDocker基础

Linux软件安装 yum命令安装 通过yum命令安装软件,是直接把软件安装到Linux系统中 安装和卸载都比较麻烦,因为软件和系统是强关联的 Docker docker是一种容器技术,可以解决软件和系统强关联关系,使得软件的安装和卸载更方便,它可以将我们的应用以及依赖进行打包,制作出一个镜…

算法:TopK问题

题目 有10亿个数字&#xff0c;需要找出其中的前k大个数字。 为了方便讲解&#xff0c;这里令k为5。 思路分析&#xff08;以找前k大个数字为例&#xff09; 很容易想到&#xff0c;进行排序&#xff0c;然后取前k个数字即可。 但是&#xff0c;难点在于&#xff0c;10亿个数…