什么是脏读?不可重复读?幻读?如何解决?

article/2025/10/2 22:52:46

什么是脏读?不可重复读?幻读?如何解决?

朋友最近面试美团,被面试官问到数据库的幻读问题,自己正好最近复习到这,做个笔记整理一下数据库的三大特征以及隔离级别。

一.先来回顾一下什么是事务,以及事务的四大特征

事务
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果将使数据库从一种一致性状态变迁到另一种一致性状态。事务是逻辑上的一组操作,要么全部执行,要么全部不执行
事务简单的来说,就是要么全部执行,要么全部不执行,成为一个最小的原子单位。

事务的基本步骤:
1.开启事务START TRANSACTION 或者BEGIN
2.回滚事务(rollback)
3.提交事务COMMIT

事务的四大特征
1.原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用

2.一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的。

3.隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的

4.持久性:一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响

而我们今天的主题就是隔离性

二 .SQL标准定义的四个隔离级别

1 **Read Uncommitted(读取未提交)😗*最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

2 **Read Committed(读取已提交)😗*允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

3 **Repeatable Read(可重复读)😗*对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生

4 **Serializable(可串行化)😗最高的隔离级别,完全服从AC|D的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别 可以防止脏读、不可重复读以及幻读*。
虽然将事务设置为可串行化可以防止脏读,不可重复读和幻读,但是安全性升高之后,程序的执行效率会降低。
在这里插入图片描述

三.什么是脏读?幻读?不可重复读?

1脏读( Drity Read:某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个事务RollBack了操作,则后个事务所读取的数据就会是不正确的。
经典案例1
张三和李四银行账户都为1000,张三声称要给李四转账500,但是在数据库操作中张三update了数据(张三账户-500,李四账户+500)后,并未commit事务,此时李四的事务进行查询时就是一个临时数据(李四账户查询+500),此后张三未提交事务,进行回滚操作,则张三并未转账。

2不可重复读(Non- repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了个事务更新的原有的数据。
经典案例2
张三在查询自己的余额时(开启一个事务),账户显示余额为1000,然后余额被转出500,再次查询时,余额变成了500.(此处需要注意,张三开启的事务为同一个,并未结束事务,两次查询结果不一样是不合理的,现实中在ATM机上查询->转账->查询,两次结果不一样可以是认为是分别开启了两次事务
3幻读( Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(RoW)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
经典案例3
银行账户中,原有的数据没有改变,但是在同一个事务中,两次查询多了几行或者几列数据。
原数据:
在这里插入图片描述
第二次查询:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/tqAQ59Sc.shtml

相关文章

MySQL理论:脏读、不可重复读、幻读

🏆今日学习目标: 🍀MySQL理论:脏读、不可重复读、幻读 ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区&#xf…

数据库事务隔离级别(脏读、幻读、不可重复读)

一、脏读、幻读和不可重复读 一、脏读、不可重复读、幻读 1、脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了…

快速理解脏读,不可重复读,幻读

介绍 要聊事务,不可避免的要提到数据库事务的四大特性:ACID atomicconsistenceisolationdurability 先放一个表格,看看4个隔离级别会出现的各种问题,网上的解释一大堆。看完后还是一脸懵逼,感觉懂了,又好…

MySQL之脏写、脏读、不可重复读、幻读

脏写和脏读都是在多个事务同时修改或读取同一行数据的情况下产生的问题。比如现在有事务1和事务2同时对一行数据进行修改,事务1将值改成1,而事务2将值改成了2,这时的值应该是2,但是就在这时,事务1发生了回滚&#xff0…

数据库必备知识:脏读和幻读的定义及应对策略

随着数据库应用的广泛使用,数据库并发性和一致性的问题成为了引起重视的问题之一。其中,脏读(Dirty Read)和幻读(Phantom Read)是常见的并发访问问题,本文将对脏读、幻读进行详细介绍&#xff0…

Seata AT模式怎样防止脏写和脏读

前言 Seata AT 模式是一种非侵入式的分布式事务解决方案,Seata 在内部做了对数据库操作的代理层,我们使用 Seata AT 模式时,实际上用的是 Seata 自带的数据源代理 DataSourceProxy,Seata 在这层代理中加入了很多逻辑,…

mysql 脏数据是什么_什么是脏读?

什么是脏读? 脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的,值得注意的是&…

[Database] 脏读、幻读这些都是什么?事务隔离级别又是什么?MySQL数据库的事务隔离级别都有哪些?

文章目录 前言事务隔离级别三种数据不一致问题1. 脏读2. 不可重复读3. 幻读不可重复读 vs 幻读 四种事务隔离级别1. READ UNCOMMITTED2. READ COMMITTED3. REPEATABLE READ4. SERIALIZABLE 不同事务隔离级别会面临的问题不同隔离事务级别的使用率排名 实战查看事务隔离级别更改…

Mysql-详解脏读、不可重复读、幻读

Mysql的事务隔离级别 Mysql有四种事务隔离级别,这四种隔离级别代表当存在多个事务并发冲突时,可能出现的脏读、不可重复读、幻读的问题。 脏读 大家看一下,我们有两个事务,一个是 Transaction A,一个是 Transaction B…

MySQL的事务,脏读,不可重复读,幻读

一、什么是事务 在MySQL中,事务是一种机制、一个操作序列,是访问和更新数据库的程序执行单元。事务中包含一个或多个数据库操作命令,会把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行&#…

脏读、幻读、不可重复读,傻傻分不清楚

脏读 (针对未提交数据) 脏读又称无效数据读出(读出了脏数据)。一个事务读取另外一个事务还没有提交的数据叫脏读。 例如:事务T1修改了某个表中的一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改…

【MySQL理论】脏读、不可重复读、幻读

文章目录 1. 脏读(dirty read)脏读是指事务读取到其他事务未提交的数据 2. 不可重复读(non-repeatable read)不可重复读是指在同一次事务中前后查询不一致的问题 3. 幻读(phantom read)幻读是一次事务中前后数据量发生变化,用户产生不可预料的问题 4. 不可重复读和幻…

脏读、不可重复读、幻读、丢失更新

根儿上来说,为什么需要事务和锁? 如果所有的操作都是依次进行的,或者说mysql的server是单线程的,就不会有并发问题,也就不需要事务和锁了。然而事实上,是多客户端,多线程的,所有必须…

一文搞懂MySQL脏读,幻读和不可重复读

目录 MySQL 中事务的隔离 1.READ UNCOMMITTED2.READ COMMITTED3.REPEATABLE READ4.SERIALIZABLE前置知识 1.事务相关的常用命令2.MySQL 8 之前查询事务的隔离级别3.MySQL 8 之后查询事务的隔离级别4.查看连接的客户端详情5.查询连接客户端的数量6.设置客户端的事务隔离级别7.新…

脏读、幻读和不可重复读

一、引言 脏读、不可重复读和幻读是数据库中由于并发访问导致的数据读取问题。当多个事务同时进行时可以通过修改数据库事务的隔离级别来处理这三个问题。 二、问题解释 1、脏读(读取未提交的数据) 脏读又称无效数据的读出,是指在数据库访…

一文详解脏读、不可重复读、幻读

MySQL 是支持多事务并发执行的。否则来一个事务处理一个请求,处理一个人请求的时候,其它事务都等着,那估计都没人敢用MySQL作为数据库,因为用户体验太差,估计都要砸键盘了。 既然事务可以并发操作,这里就有一些问题:一…

快速理解脏读、不可重复读和幻读

MySQL的InnoDB引擎是支持事务的,但是并发事务的处理又会带来以下问题: 脏读不可重复读幻读 一、脏读 脏读指事务A读取到了事务B更新了但是未提交的数据,然后事务B由于某种错误发生回滚,那么事务A读取到的就是脏数据。 具体的说…

引用及指针和引用的区别

一.在C语言中,我们要给函数传参,有两种方法。 1.传值 void Swap(int a,int b) {int tmpa;ab;btmp; } int main() {int a10;int b20;Swap(a,b);return 0; }优点:形参不影响实参(保护实参),可读性强。 缺点…

C++ | 指针和引用的区别

01. C——指针和引用的区别 指针是一个存储变量地址的变量,指向内存的一个存储单元。 引用只是一个别名。 int a1; int *p&a;int a1; int &ba;使用sizeof看一个指针的大小是8,而引用则是被引用对象的大小。指针可以被初始化为NULL,…

C++—指针与引用的区别与联系

一、为什么要有引用(C语言没有) ▪ 因为引⽤和值有⼀样的语义,而指针不是 ▪ 不存在空引⽤,必须初始化;保证值不变,保证编译器更加安全 ▪ 加减号、赋值操作符,作⽤在引用上会触发对象的操作符重…