电商交易系统重要概念:什么是脏读、不可重复读、幻读?

事务隔离级别|脏读 / 不可重复读 / 幻读,场景 + 解决方案 上一篇我们学习了事务的基础概念与ACID 四大特性,其中隔离性(Isolation)是专门用来管控多个事务并发执行的核心规则。在互联网、金融、电商等场景中,数据库会同时接收大量客户端请求,也就是并发事务。脏读、不可重复读、幻读。为了平衡数据安全性与查询性能,SQL 标准定义了四大事务隔离级别,不同级别能解决不同的并发问题。本篇将循序渐进讲解三大并发异常、四大隔离级别、级别切换语法、底层实现、场景选型以及生产环境解决方案,搭配多会话实操案例,知识点全面。三大并发异常脏读:读到未提交数据,风险最高; 阅读详情

在数据库事务并发执行时,如果没有适当的隔离控制,会出现三类经典的数据一致性问题:脏读(Dirty Read)、不可重复读(Non-Repeatable Read)、幻读(Phantom Read)。它们的严重程度依次递增,也是 SQL 标准定义四种隔离级别的依据。

下面通过具体业务场景 + 示例逐一说明:


一、脏读(Dirty Read)

读到了另一个事务尚未提交(可能回滚)的数据

📌 场景:用户查看账户余额
  • 事务 A:正在转账(从账户 X 扣 100 元)
  • 事务 B:同时查询账户 X 的余额
⏱️ 执行过程:
-- 事务 A
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;  -- 余额从 500 → 400

-- 事务 B(此时事务 A 未提交!)
START TRANSACTION;
SELECT balance FROM accounts WHERE user_id = 1;  -- 读到 400 元!

-- 事务 A(突然出错,回滚)
ROLLBACK;  -- 余额恢复为 500
❌ 问题:

事务 B 看到了 400 元,但这个数据从未真正存在过(因为 A 回滚了)。
这就是 脏读——读到了“脏数据”。

✅ 解决方案:隔离级别 ≥ READ COMMITTED(RC)即可禁止脏读。


二、不可重复读(Non-Repeatable Read)

同一个事务内,两次读同一行数据,结果不同(因为其他事务已提交修改)

📌 场景:电商下单前检查库存
  • 事务 A:准备下单,先查库存
  • 事务 B:同时卖出同一商品,扣减库存并提交
⏱️ 执行过程:
-- 事务 A
START TRANSACTION;
SELECT stock FROM products WHERE sku_id = 1001;  -- 第一次读:stock = 10

-- 事务 B
START TRANSACTION;
UPDATE products SET stock = stock - 1 WHERE sku_id = 1001;  -- stock = 9
COMMIT;  -- 提交!

-- 事务 A(继续)
SELECT stock FROM products WHERE sku_id = 1001;  -- 第二次读:stock = 9 ❗
❌ 问题:

事务 A 在同一个事务中,对同一行(sku_id=1001)读了两次,结果不一致。
如果 A 第一次读到 10 就认为“有货”,但第二次发现只剩 9,可能导致逻辑错误(如超卖判断失效)。

✅ 解决方案:隔离级别 ≥ REPEATABLE READ(RR)可禁止不可重复读。


三、幻读(Phantom Read)

同一个事务内,两次执行相同的范围查询,返回的记录数不同(因为其他事务插入/删除了符合范围的新行)

📌 场景:管理员禁止用户在 5 分钟内重复下单同一商品
  • 事务 A:检查用户最近是否有下单
  • 事务 B:同时插入一条新的订单
⏱️ 执行过程:
-- 事务 A
START TRANSACTION;
SELECT * FROM orders 
WHERE user_id = 100 AND sku_id = 200 
  AND create_time > NOW() - INTERVAL 5 MINUTE;  -- 查到 0 条,认为可下单

-- 事务 B
START TRANSACTION;
INSERT INTO orders (user_id, sku_id, ...) 
VALUES (100, 200, ...);  -- 插入一条新订单
COMMIT;

-- 事务 A(继续)
SELECT * FROM orders 
WHERE user_id = 100 AND sku_id = 200 
  AND create_time > NOW() - INTERVAL 5 MINUTE;  -- 现在查到 1 条!
❌ 问题:

事务 A 两次执行完全相同的范围查询,结果集行数从 0 变成 1,仿佛出现了“幻影”(Phantom)。
如果 A 在第一次查询后直接插入订单,就会违反“5分钟内不能重复下单”的业务规则。

✅ 标准 SQL 解决方案:隔离级别 = SERIALIZABLE
✅ MySQL InnoDB 特殊优化:在 REPEATABLE READ 下通过 Next-Key Lock(间隙锁) 实际避免了幻读(需使用 SELECT ... FOR UPDATE 等当前读)。


四、三者对比总结

问题类型操作对象原因是否修改了已存在行典型场景
脏读单行读到未提交的数据是(但会回滚)查看中间状态余额
不可重复读单行其他事务已提交修改是库存、价格变动
幻读多行(范围)其他事务插入/删除了新行否(是新增/消失行)订单去重、分页防重复

🔑 关键区别:

  • 脏读 / 不可重复读:针对已存在的某一行
  • 幻读:针对满足条件的行集合(范围变化)

五、MySQL 中的实际表现(InnoDB 引擎)

隔离级别脏读不可重复读幻读(标准)幻读(MySQL RR)
READ UNCOMMITTED✅✅✅✅
READ COMMITTED❌✅✅✅(普通 SELECT 无锁)
REPEATABLE READ❌❌✅❌(通过间隙锁避免)
SERIALIZABLE❌❌❌❌

💡 注意:MySQL 的 REPEATABLE READ 强于 SQL 标准,在使用 SELECT ... FOR UPDATE / UPDATE 等当前读时,能通过间隙锁防止幻读。


六、如何避免?—— 开发建议

  1. 避免脏读:生产环境不要用 READ UNCOMMITTED
  2. 避免不可重复读:核心业务(如库存、支付)使用 REPEATABLE READ 或显式加锁
  3. 避免幻读:
    • 范围操作(如查最近订单)必须用 SELECT ... FOR UPDATE
    • 确保查询字段有合适索引(否则锁全表!)
    • 考虑用唯一约束替代应用层检查(如 (user_id, sku_id, 5min_window) 唯一键)

🌰 一句话记住:
“脏读看未提交,不可重复读看已提交的修改,幻读看新出现的行。”

AHB不对称半桥反激电路设计(三)主要器件参数规格计算 本文介绍了AHB拓扑变压器的设计步骤与核心参数计算,包括主控芯片选择、工作原理分析及参数计算。作者选择DK87XXD集成MOS方案,详细阐述了输入电压范围、反射电压限定、匝比计算、工作频率设定、原副边电流值、电感量计算、磁芯选择、匝数计算、谐振电容设计等关键步骤。通过公式推导与实例计算,展示了150W电源的变压器设计过程,最终确定匝比5.5、原边22匝、副边4匝、电感量200uH等参数。文章还讨论了谐振电容与漏感的关系,为后续调试提供理论基础。该设计方法结合理论分析与工程实践,适用于AHB拓扑电源开发。 阅读详情

相关推荐

NFT图片批量合成及稀有度计算工具

一、制作背景 -当前NFT作品制作的大多方式都是使用部件拼接的形式,然后从大量的可能性结果取优; 二、解决问题 拼接合成的组合数量十分巨大,手工合成费时费力; 合成中对各个部件的使用次数不容易控制,部位出现的概率对作品的稀有度及评分影响较大; 对于生成的作品各个部位的信息(包括来源和使用率)统计繁琐,不利于对作品的介绍中体现; 三、程序功能介绍 1、功能自定义部位稀有度批量合成NFT作品 步骤一:创建各个合成部件文件夹,将图片放到文件夹内 步骤二:软件上设置各个部件对于的图片文件夹及出现的概率 步骤二

Keeping111的博客 4638

3.电商订单数据清洗:从脏数据到准确反映业务事实

电商订单数据清洗是数据分析的关键步骤,本文介绍了常见脏数据处理方法:1)缺失值处理:识别并填充/删除缺失值;2)重复值处理:基于订单号去重;3)异常值处理:识别负值/超大金额订单;4)数据类型转换:规范日期、金额等格式。实操提示包括备份原始数据、根据业务逻辑填充缺失值、谨慎处理异常值等。通过生成模拟脏数据文件(dirty_orders.csv),演示了完整的清洗流程,帮助电商数据分析师提升数据质量。

qq_65772430的博客 641

SPSS(二)SPSS实现多因素方差分析模型(图文教程+数据集)

SPSS(二)SPSS实现多因素方差分析模型 单因素方差分析上一篇博客https://blog.youkuaiyun.com/LuYi_WeiLin/article/details/89917656已经介绍完毕 这篇博客我们主要来学习多因素方差分析 多因素方差分析,就是同时考虑若干个控制因素的情况下,分别分析它们的改变是否造成观察变量的显著变动 (多个自变量,一个因变量)自变量类型以分类变量为主也可以...

可乐联盟 6万+

脏读、幻读、不可重复读

在数据库事务管理中,是三种常见的读一致性问题,它们与事务的隔离级别密切相关。

qq_73683016的博客 1394

STM32控制气泵和电磁阀实现

2、mos管的选型:mos管选择主要注意两个参数即可,一是导通的电流,二是耐压值,并且常用NMOS管,根据要求,气泵和电磁阀供电电压为12V,所以选择的mos管耐压值要大于12V,这里选用耐压值为30V的MOS管,并且导通电流为5.8A,如下图。1、气泵和电磁阀的开和关均为开关量,实现控制方法有多种,比如继电器,但是继电器动作有噪声且体积较大,更好的方法为使用mos管。使用STM32控制气泵和电磁阀的开和关,气泵和电磁阀的供电电压为12V。最终实现单片机控制气泵和电磁阀的开和关。

jacklood的博客 1万+

NR RRC协议(2)---RRC连接建立流程

RRC连接建立目的是建立SRB1 RRC连接建立还用于将初始NAS消息从UE传送到网络 RRC连接的初始阶段期间,不激活AS安全性 RRC连接建立由UE侧发起

crg2046的博客 1957

(MySOL高频面试题)什么是脏读、不可重复读、幻读?如何解决?

举个例子,事务 A 查询年龄小于 30 岁的用户有 10 人,事务 B 插入了一条新用户数据并提交,事务 A 再次查询就发现有 11 人了。给您举个例子,就好比在电商系统里,用户 A 看到订单金额被改成了 100 元,可这其实是事务 B 未提交的操作,要是事务 B 最后回滚了,金额就恢复原值了,那用户 A 之前看到的 100 元就是脏数据。事务A第一次查询余额为500元,事务B扣款后提交,事务A第二次查询余额变为400元。事务A读取到事务B 未提交 的修改数据,若事务B回滚,事务A读到的是“脏数据”。

2401_87145357的博客 1556

YOLOv8中的C2f模块代码详解

在YOLOv8网络结构中,C2f模块(CSP Bottleneck with 2 Convolutions)是一个关键组件,用于实现跨阶段部分聚合

zzzyyy8的博客 3万+

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

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

2301_76166241的博客 871

cesium 综合教程200+【目录】(已包含186篇文章)

cesium示例教程100+旨在为开发者提供简单快捷的,。在每一个示例中,解释相应的API知识点,做到。目录中有链接的为已有文章,没链接的为目标文章,不断更新中…

大剑师兰特的GIS世界 8898

uniapp [安卓苹果App端] - 实现获取请求手机位置权限+开启定位获取经纬度/省市区地址等,检测权限手机定位是否开启并引导用户同意授权,uniApp app端调用本机开启本机定位权限及IP属地

uni-app,手机定位权限,安卓Android,苹果ios,uniapp获取本机位置权限,uni-app获取用户定位数据,uniapp APP获取用户IP属地定位,判断权限,权限被拒绝了怎么办,苹果ios系统无法开启定位,获取定位权限报错,uniapp定位获取省市区,UNI-APP如何开启手机定位功能并获取经纬度,不依赖地图第三方插件组件,打包上架后如何获取,真机运行无法获取定位,安卓和ios权限获取,判断权限检查,正式打包,详细教程,根据获取当前经纬度,再根据经纬度去定位具体省市区,自定义基座打包能成功

🏆 前端领域优质创作者 1万+

mysql:深度解析数据库隔离问题:脏读、不可重复读与幻读的本质与解决方案

问题类型单机解决方案分布式解决方案监控指标脏读升级到RC级别分布式锁+版本号不可重复读RR隔离+乐观锁Saga事务模式幻读间隙锁+索引优化CDC事件流+物化视图字节跳动内部指标:通过监控锁争用情况,要求锁等待时间<50ms。

weixin_43290370的博客 1196

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

根据业务场景选择合适的隔离级别和锁机制,可以显著提升系统的稳定性和性能。同一事务内多次查询同一范围的数据,结果集的行数不同(因其他事务插入或删除了符合该范围的数据)。一个事务读取了另一个未提交事务的中间数据。如果后者回滚,前者读取的数据就是无效的。同一事务内多次读取同一数据,结果不一致(因其他事务修改了该数据并提交)。两个事务同时读取并修改同一数据,后提交的事务覆盖了先提交的事务的修改。通过快照(MVCC)或行锁,保证事务内多次读取结果一致。事务B取出30,更新X=70(覆盖了事务A的修改)。

qq_40453972的博客 839

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深入理解数据库并发问题:脏读、不可重复读与幻读

脏读指一个事务读取到了另一个事务尚未提交的修改数据。若后续事务回滚,当前事务读取到的就是 “无效的脏数据”,最终导致业务逻辑错误。不可重复读指同一事务内,多次读取同一批数据时,后一次读取的结果与前一次不一致(通常是因为中间被其他事务修改并提交了)。注意:不可重复读的核心是 “数据被修改 / 删除”,且修改者已提交事务。幻读指同一事务内,多次执行相同的查询语句(通常是范围查询)时,返回的结果集行数不一致(通常是因为其他事务插入 / 删除了符合条件的记录并提交)。

2201_75510917的博客 1082

解析数据库并发三大“坑”:脏读、不可重复读与幻读

摘要:数据库并发操作会引发脏读、不可重复读和幻读三类数据一致性问题,不同隔离级别可针对性解决这些问题。脏读是读取未提交的无效数据,不可重复读指同一事务内相同查询结果不一致,幻读则是查询结果集数量变化。四种隔离级别中,读未提交允许所有问题,读已提交解决脏读,可重复读解决前两类,串行化彻底杜绝问题但性能最低。实际应用中需根据业务需求在并发性能和数据一致性间取得平衡,如MySQL默认采用可重复读,金融系统可能使用串行化。理解这些问题与隔离级别的对应关系是数据库开发运维的基础。

码路同行 1017

MySQL 事务隔离级别详解!用例子讲透脏读、不可重复读、幻读

定义:事务 A 在同一执行过程中,多次按相同条件查询范围数据,若事务 B 在两次查询之间插入或删除了符合条件的记录,事务 A 会发现查询结果的行数发生变化,如同出现 “幻觉”,即 “幻读”。场景示例:某电商平台统计库存表(product_stock)中 “库存小于 10 件” 的商品数量,事务 A 执行统计操作,事务 B 在中间插入一条符合条件的记录:​。场景示例:仍以用户账户表为例,事务 A 需要分两步核对用户余额(先查询余额,再验证是否满足消费条件),事务 B 在中间执行余额修改:​。

2509_93051135的博客 1008

深入理解数据库事务问题:脏读、幻读与不可重复读的实战解析

比如电商系统中显示库存时,如果读取了另一个事务未提交的库存修改,用户看到的可能是虚假信息。在较长时间运行的事务中,如果允许其他事务修改已读取的数据,就会出现不可重复读。这个级别性能最好但风险最高,适合对数据准确性要求不高但需要极高性能的场合,如某些实时监控系统可以容忍短暂的数据不一致。针对不同隔离级别编写专门的并发测试用例,模拟真实场景下的数据竞争条件,确保系统在各种情况下都能保持预期行为。不同ORM框架对隔离级别的默认设置不同,开发时需要明确了解所使用的框架行为,避免想当然。读未提交级别的适用场景。

FrostfirePanther89的博客 669

【一文搞懂】MySQL的脏读、不可重复读和幻读及解决方案(四级事务隔离级别)

【一文搞懂】MySQL的脏读、不可重复读和幻读及解决方案(四级事务隔离级别)

多学、多想、多做 1162

MySQL中是如何解决幻读的?深入解析

MySQL幻读问题解决方案摘要 MySQL通过InnoDB引擎的MVCC和间隙锁机制解决幻读问题。幻读指同一事务内两次相同查询看到不同结果行的现象,区别于不可重复读(关注行数据变化而非新行出现)。 核心解决方案: MVCC机制 - 通过事务ID和版本链实现多版本控制,确保事务内读取一致性视图 间隙锁 - 锁定索引记录间的间隙,防止其他事务插入新记录 实现特点: 可重复读隔离级别下即解决幻读(MySQL特有) 通过Next-Key锁(记录锁+间隙锁组合)实现范围锁定 对UPDATE/DELETE和带锁SELE

从不水文,坚持创作,加油 2902

InnoDB事务隔离级别实战指南:从脏读到幻读的避坑手册

本文深入解析MySQL InnoDB事务隔离级别,通过电商库存扣减等实战场景,详解脏读、不可重复读和幻读的成因与区别。结合MVCC底层原理,为开发者提供从READ COMMITTED到REPEATABLE READ的选型建议,并给出Spring事务配置、乐观锁/悲观锁应用及高并发优化方案,帮助您规避数据一致性问题,平衡系统性能。

h0i1j2k3l的博客 596

数据库并发控制:脏读、不可重复读与幻读解析

数据库并发控制是确保多事务环境下数据一致性的关键技术。其核心原理是通过事务隔离机制防止数据冲突,常见实现方式包括锁机制和多版本并发控制(MVCC)。这些技术能有效解决高并发场景下的数据一致性问题,对于电商库存管理、金融交易等业务至关重要。以脏读为例,当事务读取到未提交的中间状态数据时,可能导致财务统计错误或库存超卖。通过设置READ_COMMITTED隔离级别,配合MySQL的undo日志或PostgreSQL的MVCC机制,可以避免这类问题。理解这些基础概念不仅能优化系统设计,也是处理分布式数据库挑战的重

weixin_31220401的博客 300

MySQL 事务隔离级别:用案例讲透 “脏读 / 不可重复读 / 幻读”

幻读与不可重复读的区别在于:不可重复读针对的是单行数据的修改,而幻读针对的是结果集的新增或删除。不可重复读与脏读的区别在于:脏读读取的是未提交的数据,而不可重复读读取的是已提交的数据。MySQL 作为目前最流行的关系型数据库之一,其事务隔离级别直接决定了并发操作时数据的可见性规则,而脏读、不可重复读、幻读这三个概念,正是理解隔离级别的关键钥匙。MySQL 的 “读未提交”(Read Uncommitted)隔离级别允许脏读,这是最低的隔离级别,仅能保证事务的原子性,几乎不提供并发控制。

2509_93051135的博客 426

MySQL中的幻读与不可重复读:区别及解决方案

摘要:MySQL中幻读与不可重复读的核心区别在于数据范围变化(幻读)与单行数据修改(不可重复读)。解决方案上,不可重复读通过MVCC机制(RR隔离级别)实现快照读;幻读则依赖临键锁/间隙锁锁定索引范围。默认RR级别结合MVCC与间隙锁同时解决两种问题,但需注意索引设计以避免锁冲突。实际应用中需权衡隔离级别(RC高并发读 vs RR强一致性 vs Serializable严格串行),并通过缩短事务、优化索引来平衡性能与一致性。

a9b9a9b9的专栏 651

MySQL事务隔离级别详解:从脏读到幻读,如何选择最适合你的隔离级别

本文深入解析MySQL事务隔离级别,包括READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE,详细讨论它们在脏读、不可重复读和幻读问题上的表现。通过性能对比和实战测试,提供高并发场景下的选择策略,帮助开发者根据业务需求优化数据库性能和数据一致性。

sea99的博客 897

mysql如何解决并发问题下的重复读和幻读问题

一、MySQL 幻读被彻底解决了吗MySQL InnoDB 引擎的默认隔离级别虽然是【可重复读】,但是它很大程度上避免幻读现象(并不是完全解决了),解决的方案有两种:针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好的避免了幻读问题。

qq_39789295的博客 918

EF Core事务隔离级别详解:5种级别如何选择才能避免数据脏读?

掌握EF Core的事务隔离级别选择方法,有效避免脏读、不可重复读等问题。详解5种隔离级别的适用场景与性能影响,结合代码示例说明如何在实际项目中正确配置。提升数据一致性与系统可靠性,值得收藏。

QuickCode的博客 606
上一篇: MySQL8 特性与场景优化
下一篇: 模块化的Agent(智能体)架构知识点有哪些
旷野说
博客等级 码龄9年 361粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值