MySQL事务隔离级别实现原理:用生活例子讲透,小白3分钟看懂

美团面试官:可重复读隔离级别实现原理是什么?(一文搞懂MVCC机制) 可重复读隔离级别实现原理是什么?它和MVCC又有什么关系?什么是Read View? 阅读详情

MySQL事务隔离级别实现原理:用生活例子讲透,小白3分钟看懂

一、先建立一个真实场景(所有例子都围绕它)

我们开一家「小明奶茶店」,用一张 orders 表记录订单:

CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer VARCHAR(20),
  drink VARCHAR(20),
  status ENUM('pending', 'done') DEFAULT 'pending'
);

初始数据:

idcustomerdrinkstatus
1小红珍珠奶茶pending
2小刚椰果乌龙pending

现在有两位店员(事务A和事务B)同时工作——这就是并发。


二、四种隔离级别,全用「奶茶店日常」举例说明

▶ 场景1:READ UNCOMMITTED(读未提交)→ “偷看草稿本”

  • 事务A(店长查漏单):
    SELECT * FROM orders WHERE status = 'pending'; → 看到2单(小红、小刚)

  • 事务B(新店员手抖):
    INSERT INTO orders VALUES (3, '小美', '芋圆奶绿', 'pending');
    UPDATE orders SET status = 'done' WHERE id = 1; ← 但还没点“确认提交”按钮(即未 COMMIT)

  • 事务A再次查询:
    SELECT * FROM orders WHERE status = 'pending';
    → 突然看到3单!还发现小红那单状态变成 'done'!

✅ 这就是脏读:A读到了B根本没保存成功的临时操作。
⚠️ 后果:店长以为小美下单了、小红喝完了,结果B一取消,全白忙。

💡 实现原理:不加任何读锁,写操作也只加最轻的共享锁(允许别人读未提交) —— 完全放养。


▶ 场景2:READ COMMITTED(读已提交)→ “只看盖章版”

  • 事务A第一次查:
    SELECT * FROM orders WHERE status = 'pending'; → 看到2单(小红、小刚)

  • 事务B操作并提交:
    UPDATE orders SET status = 'done' WHERE id = 1;
    COMMIT; ← ✅ 盖章生效!

  • 事务A再次查:
    SELECT * FROM orders WHERE status = 'pending'; → 只剩1单(小刚)!小红那单不见了。

✅ 解决了脏读(再也看不到未盖章的修改),
❌ 但出现不可重复读:同一事务内,两次查同一行,结果不同。

💡 实现原理:每次 SELECT 都生成新快照(Read View),只包含“已盖章”的事务修改;写时加排他锁,防止覆盖。


▶ 场景3:REPEATABLE READ(可重复读,MySQL默认)→ “锁定今日菜单”

  • 事务A第一次查:
    SELECT * FROM orders WHERE status = 'pending'; → 看到2单(小红、小刚)

  • 事务B插入并提交:
    INSERT INTO orders VALUES (3, '小美', '芋圆奶绿', 'pending');
    COMMIT;

  • 事务A再次查:
    SELECT * FROM orders WHERE status = 'pending'; → 还是2单!完全没看到小美。

✅ 解决了不可重复读(A的世界时间冻结在第一次查询那一刻),
⚠️ 但幻读隐患仍在:如果A执行 UPDATE orders SET status='done' WHERE status='pending';,会更新3单(含小美)!

💡 实现原理:A第一次SELECT时就拍下全局快照(Read View复用),后续所有读都按此快照走;写操作加Next-Key Lock(记录锁+间隙锁),拦住区间插入。
🔑 关键:SELECT 不锁表但靠快照隔离;UPDATE/DELETE 自动加间隙锁防幻写。


▶ 场景4:SERIALIZABLE(可串行化)→ “一人一窗,排队办”

  • 事务A执行:
    SELECT * FROM orders WHERE status = 'pending';
    → 系统自动给 status='pending' 的所有行加读锁

  • 事务B此时想插入新单:
    INSERT INTO orders VALUES (3, '小美', '芋圆奶绿', 'pending');
    → ⏳ 卡住!等A释放锁(COMMIT或ROLLBACK后才继续)

✅ 彻底消灭脏读、不可重复读、幻读,
❌ 性能暴跌:所有人必须排队,高峰期窗口全堵死。

💡 实现原理:把所有 SELECT 当成 SELECT ... LOCK IN SHARE MODE,读写互斥,物理串行。


三、对比表:一句话看穿本质区别

隔离级别小红点单后,小刚能不能立刻看到?小刚查两次pending单,数量会变吗?小刚查完,小美能插队下单吗?店铺效率
读未提交✅(看到未确认单)✅(第二次可能少1单)✅(随便插)⚡ 最快,但错乱
读已提交❌(要等小红点“确认”)✅(小红确认后,第二次就少了)✅(小美随时能插)🚀 快,较稳
可重复读❌(小红确认也不影响小刚快照)❌(两次结果绝对一样)⚠️(小美能插,但小刚UPDATE时会被锁住)🐢 稍慢,极稳
可串行化❌(小红点单=锁住pending区域)❌❌(小美必须等小刚办完)🐌 最慢,绝对稳

四、真正决定行为的不是“级别名”,而是“你写的SQL类型”

你的SQL写法在RR级别下实际行为为什么?
SELECT * FROM orders;✅ 读快照,不锁表MVCC兜底,无感并发
SELECT * FROM orders WHERE id=1;✅ 读快照,且对id=1这行加隐式读锁(不阻塞其他读)精确匹配,InnoDB优化
SELECT * FROM orders WHERE status='pending' FOR UPDATE;❌ 不读快照!查最新数据,并对所有status='pending'的行+间隙加写锁显式要求强一致性,触发锁机制
UPDATE orders SET status='done' WHERE id=1;❌ 不读快照!查最新数据,并对id=1加行锁+前后间隙锁写操作天然绕过MVCC,直面锁

✅ 记住:“读”靠MVCC快照,“写”靠锁。级别只是设定默认策略,SQL才是最终裁判。


五、终极口诀(背下来直接用)

读未提交:啥都敢看,错得离谱;
读已提交:只看盖章件,但章会变;
可重复读:给你印一本今日菜单,翻烂都不改;
可串行化:所有人排队,窗口只开一个。

你现在能清晰回答:
🔹 为什么淘宝订单详情页刷新10次数据不变?→ REPEATABLE READ + MVCC快照;
🔹 为什么抢券时总提示“库存不足”?→ SELECT ... FOR UPDATE + Gap Lock锁住库存区间;
🔹 为什么日志系统用READ COMMITTED?→ 要最新数据,不怕短暂不一致,换高性能。

原理不在纸上,在每一行执行的SQL里——动手试一次,比读十篇文章都管用。


参考来源

 

大厂面试快问快答,10分钟搞定MySQL夺命20问,你都能接住吗? 号外号外!《死磕 Java 并发编程》系列连载中,大家可以关注一波: 「死磕 Java 并发编程05」阿里面试失败后,一气之下我图解了Java中18把锁 「死磕 Java 并发编程04」说说Java Atomic 原子类的实现原理 「死磕 Java 并发编程03」阿里二面,面试官:说说 Java CAS 原理? 「死磕 Java 并发编程02」面试官:说说什么是 Java 内存模型(JMM)? 「死磕 Java 并发编程01」10张图告诉你Java并发多线程那些破事 先看下目录: 1说说. 阅读详情

相关推荐

OFDM接收机同步——分组检测

上一篇讲了OFDM发射机中的长短训练序列生成原理,基于此可以得到长短训练序列的准确数值,为接收机中的符号同步中的相关运算提供基础。 进入符号同步前,首先来看OFDM接收机中的第一步——分组检测。分组检测就是检测突发传输方式的信道上是否有新的数据到达,算法的好坏直接影响着接收机的后续工作性能。 一、本文意义 基于《基于xilinx fpga 的ofdm的通信系统基带设计》这本教材中分组检测算法原理,通过matlab编程仿真验证“延时相关+保持长度”分组检测算法的有效性。同时,通过仿真证明教材上的判决公式的问题

boayel的博客 2201

3分钟搞懂MySQL事务隔离级别及SET TRANSACTION影响事务

导读:MySQL支持SQL:1992标准中的所有事务隔离级别,使用SET TRANSACTION来设置不同的事务隔离级别或访问模式,我们一起实战下它的效果。我们都知道,MySQL的内置引...

Enmotech的博客 1415

AVM环视:系统搭建整体流程

文章目录前言一、畸变矫正鱼眼相机二、透视变换三、图像拼接四、图像融合总结 前言 由于正在做AVM环视,所以记录一下整个过程,归纳为一个系列文章,并对期间遇到的错误进行归纳整理。本文主要概括了AVM环视的大致流程和逻辑,不涉及代码部分,仅供思路参考,其中涉及的具体技术会在后期整理为小章节进行分析。 一、畸变矫正 鱼眼相机 做环视基本上使用到的是鱼眼照片,因为鱼眼相机的视角范围可以达到220°到230°,所以一个相机就可以采集到一个面的全部信息,例如汽车具有四个面,那么在汽车的前后左右分别安装一个鱼眼相机.

qq_34468890的博客 6536

同一事务多次加for_只需5分钟,看懂MySQL事务隔离级别的实现原理

概述今天主要分享下MySQL事务隔离级别的实现原理,因为只有InnoDB支持事务,所以这里的事务隔离级别是指InnoDB下的事务隔离级别。隔离级别1)读未提交:一个事务可以读取到另一个事务未提交的修改。这会带来脏读,幻读,不可重复读问题2)读已提交:一个事务只能读取另一个事务已经提交的修改。其避免了脏读,仍然存在不可以重复读和幻读问题3)可重复读:同一个事务中多次读取相同的数据返回的结果是一样的。...

weixin_39640762的博客 162

eNSP安装教程

eNSP安装教程一、安装eNSP1、先安装依赖组件2、安装eNSP主程序eNSP+V100R003C00SPC100+Setup ---不要安装在中文路径下3、安装完成后注册设备 一、安装eNSP 程序包位置:https://drive.weixin.qq.com/s?k=AOgAQQfOAAsw1wAKEgAAcAbgbSAKQ 1、先安装依赖组件 依赖组件: WinPcap_4_1_3 —直接下一步,但不要安装在中文路径下 Wireshark_v3.4.6 或者wireshark-win3

qimowei的博客 8667

ESP8266 + MQTT :如何实现 LED 灯的远程控制

MQTT 是轻量级的、灵活的物联网消息交换和数据传递协议,致力于为 IoT 开发人员实现灵活性与硬件/网络资源的平衡。 NodeMCU 是一个开源的物联网平台。它使用 Lua 语言编程。该平台基于eLua开源项目,底层使用ESP8266 sdk 0.9.5版本。 在此项目中我们将实现 NodeMCU(ESP8266) 与 EMQ X Cloud 运营和维护的免费公共 MQTT 服务器远程控制 LED 灯,并使用 Arduino IDE 来对 NodeMCU ESP8266 进行编程。 EMQ X Cloud

emqx_broker的博客 3357

5分钟了解,Mysql事务事务隔离级别

之前介绍了声明式事务,其中的一个属性就是事务的隔离级别`isolation`。今天我们以Mysql为例,深入介绍一下事务的隔离隔离级别

static_coder的博客 999

Qt实现窗口自适应分辨率大小

如果希望窗口大小始终保持与屏幕分辨率一致,可以将上述代码放在窗口的resizeEvent()函数中。这样,每当窗口大小发生变化时,都会自动调用resizeEvent()函数,从而实现窗口大小的自适应调整。在Qt中,可以通过一些简单的方法实现窗口大小随分辨率变化而自适应调整。获取到当前屏幕的分辨率后,可以根据需要调整窗口的大小。无论在何种分辨率下运行应用程序,窗口都能够正确地自动调整大小,提供更好的用户体验。除了调整窗口大小,还可以考虑将窗口设置为最大化,以充分利用屏幕空间。步骤2:调整窗口大小。

FuJavascript的博客 3655

mysql 默认事务隔离级别_【面试必备】3分钟掌握MySQL事务隔离级别知识点!

近期,不少开发的朋友们总问我,面试时总被问到MySQL事务隔离级别基础问题,答不上来咋办,今天特意将之前写的一篇文章发出来,希望大家能有所收获!一、什么是事务概念:事务是包含了一组有序的数据库操作命令的序列,它是数据库并发操作的最小控制单位。特性:原子性:事务包含的数据库操作命令要么都执行,要么都不执行。一致性:当事务完成时,数据库处于稳定而一致的状态。即事务执行后,数据库数据要符合规定,而且所有...

weixin_39732027的博客 199

R语言做一个 GM (1,1)灰色预测模型

累加生成是GM(1,1)模型的另一个重要步骤,它通过构造累加生成序列,把非线性非平稳时间序列转化为线性平稳时间序列。GM(1,1)是一种基于灰色系统理论的预测模型,通常用于中小样本的非线性、非平稳时间序列数据分析。灰色预测模型的核心是灰度处理,将原始时间序列转化为灰色时间序列。这里使用R语言中的diff函数对时间序列进行一次差分,然后对结果取累加和得到灰度序列。以上是GM(1,1)灰色预测模型在R语言中的实现步骤。需要注意的是,GM(1,1)模型适用于中小样本的时间序列预测,对于长期预测效果可能较差。

Mrrunsen的博客 3841

什么是 Agent 的 Context Window?为什么它是 Agent 工程中最核心的约束之一?

什么是 Agent 的 Context Window?为什么它是 Agent 工程中最核心的约束之一?

我哎GIS博客 815

MySQL事务详解

目录数据库事务事务是什么事务的四大特性 MySQL事务隔离级别查看MySQL当前事务隔离级别MySQL默认操作模式为自动提交模式JDBC处理事务Spring事务Spring的事务传播PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVERPROPAGATION_NESTEDSpring事务的隔离级别Spring事

林在闪闪发光的博客 2771

音频链路分析

音频链路分析摘要 本文分析了蓝牙音频设备(BES2700)的音频传输链路,主要包括通话和音乐播放两种场景: 通话链路: 下行:蓝牙接收数据→解码→通过Codec输出到扬声器 上行:麦克风采集→Codec处理→蓝牙编码发送 音乐播放链路: 通过A2DP协议接收高质量音频数据 经过解码、EQ调节等音频处理后输出 系统采用多线程消息机制处理音频任务,通过mailbox传递控制消息,由回调函数处理具体音频数据流。不同应用场景使用不同的蓝牙协议栈(HFP/HSP用于通话,A2DP用于媒体)和编码方式(mSBC/SBC

云淡风轻 85

MySQL事务的隔离级别

事务是指单个逻辑工作单元执行得一系列操作,要么都做,要么都不做,是不可分割的工作单位,是数据库环境中的的最小工作单元。事务最经典栗子也经常被拿出来的栗子就是银行转账了。比如小明要给小红转账1000元,这个转账会涉及到两个关键操作:将小明的余额减1000元,将小红的余额减1000元。万一这两个操作之间突然出现错误,导致小明余额减少但是小红余额没有增加,这种情况是肯定不允许的。事务就是保证这两个关键操作要么都成功,要么都不成功。

林在闪闪发光的博客 1193

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

事务复制提示初始快照不可用_只需5分钟,看懂MySQL事务隔离级别的实现原理

概述今天主要分享下MySQL事务隔离级别的实现原理,因为只有InnoDB支持事务,所以这里的事务隔离级别是指InnoDB下的事务隔离级别。隔离级别1)读未提交:一个事务可以读取到另一个事务未提交的修改。这会带来脏读,幻读,不可重复读问题2)读已提交:一个事务只能读取另一个事务已经提交的修改。其避免了脏读,仍然存在不可以重复读和幻读问题3)可重复读:同一个事务中多次读取相同的数据返回的结果是一样的。...

weixin_39875167的博客 210

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

mysql set 隔离级别_3分钟搞懂MySQL事务隔离级别及SET TRANSACTION影响事务

导读:MySQL支持SQL:1992标准中的所有事务隔离级别,使用SET TRANSACTION来设置不同的事务隔离级别或访问模式,我们一起实战下它的效果。我们都知道,MySQL的内置引擎中只有InnoDB、NDB支持事务,而又以InnoDB引擎对于事务的支持最全面也使用最广泛,所以本文的讨论都是基于InnoDB引擎,实验中用的表都是基于InnoDB的表。FeatureMyISAMMemoryIn...

weixin_29371981的博客 274

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

高频面试,请说说MySQL MVCC 事务隔离机制的实现原理

MVCC(Multi-Version Concurrency Control)多版本并发控制,说人话就是,MySQL让你看到的数据,可能是它专门为你版本控制后的结果,而不是数据库里实际存储的当前值。

ly853602的博客 1615

5分钟搞懂MySQL事务隔离级别

好久没碰数据库了,只是想起自己当时在搞数据库的时候在事务隔离级别这块老是卡,似懂非懂的。现在想把这块整理出来,尽量用最简洁的语言描述出来,供新人参考。首先创建一个表 account。创建...

田维常 511

sybase 事务隔离级别_MySQL之事务隔离级别

阅读本文约需要6分钟大家好,我是你们的导师,经常看我朋友圈的同学应该知道,我每天会在微信上给大家免费提供以下服务!1、长期为你提供最优质的学习资源!2、给你解决技术问题!3、每天在朋友圈里分享优质的技术文章!4、每周1、3、5送纸质书籍免费送给大家,每年至少送书800本书!5、为大家推荐靠谱的就业单位!请注意!我上面说的5点全部都是免费的!全网你应该找不到第二家吧!当然,大家在我...

weixin_39759107的博客 105

5分钟真正理解mysql事务隔离级别和封锁协议

排他锁和共享锁1.排他锁的作用范围是:执行语句开始,到在事务提交时才会释放。2.本事务对某数据加了排他锁,则其他事务就不能对该数据加任何锁(包括排他锁和共享锁)。3.本事务对某数据加了共享锁,则其他事务也可以对该数据加共享锁。四个隔离级别1.Read Uncommitted(读取未提交内容)。其现象为脏读,即可以读取到其他事务未提交的数据。【例子1】:有两个事务同时开始,两者都在10秒后执行完毕,...

胡渣大叔的技术专栏 1793

10分钟解决Hibernate的事务管理,Hibernate当中要设置事务的隔离级别

一、事务 1、什么是事务: 事务:事物指的是逻辑上的一组操作,组成这一组操作的逻辑单元要么全成功,要么全失败 2、事务的特性: (1)原子性:代表事务不可分割。 (2)一致性:代表事务执行的前后,数据的完整性要保证一直。 (3)隔离性:代表的是一个事务执行的过程当中,不应该受到其他事务的干扰。 (4)持久性:代表一个事务执行完成后数据就持久到数据库当中(提交或回滚)。 3、如果我们不考虑事务的隔离...

程序员猫爪 1489

MySQL事务隔离级别?MVCC?

在读已提交和可重复读级别下,MVCC 都会生效,只不过 RC 是每次读生成新快照,RR 是事务内复用同一个快照,所以 RR 能保证可重复读。:读未提交、读已提交、可重复读和串行化,隔离性越来越强,但并发性能越来越低。:同一个事务里,两次按条件查询,条数不一样,像“幻觉”一样多/少了数据。事务开始后,第一次一致性读生成 Read View,后面重复使用。一致性读视图,决定当前事务能看到哪些版本的数据。,核心思想是通过保存数据的多个版本,让读操作去读。:同一个事务里,两次读同一条数据结果不一样。

2301_79989083的博客 492

面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?

面试官:听说你精通MySQL,那来和我大战三百个回合吧!

真正的大师永远怀着一颗学徒的心 1万+

MySQL事务隔离级别全面解析与实践指南

是MySQL的默认隔离级别,通过多版本并发控制(MVCC)保证事务内多次读取结果一致。虽然理论上存在幻读可能,但InnoDB引擎通过间隙锁(Gap Lock)机制实际避免了这个问题,在保证一致性的同时维持较好并发性能。实际使用中发现,通过平台的一键部署功能,不到1分钟就能搭建出完整的事务演示项目,比本地配置数据库环境高效得多。是最低隔离级别,事务可以读取其他事务未提交的数据修改。上可以快速构建隔离级别演示环境,其内置的MySQL服务支持即时调整事务隔离级别,便于可视化观察不同级别的并发控制效果。

PearlOwl67的博客 679

MySQL事务从原理到实战:隔离级别、MVCC与分布式事务全解析

在数据库系统设计中,事务是保证数据一致性的核心机制。理解事务的ACID特性,需要从原子性、一致性、隔离性、持久性四个维度深入其底层实现原理。隔离级别决定了并发事务的可见性,MySQL默认的REPEATABLE READ通过MVCC多版本并发控制和间隙锁,在绝大多数场景下规避了幻读问题,而MVCC的ReadView生成机制则是理解快照读与当前读差异的关键。事务的持久性依赖redo log与undo log的协同工作,这些日志机制不仅保障了崩溃恢复,也是分布式事务设计的基础。在实际工程中,Spring事务传播机

weixin_33875839的博客 364

【MySQL(3)| 五分钟搞清楚MySQL事务隔离级别】

事务 什么是事务? 数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;事务是一组不可再分割的操作集合(工作逻辑单元) 举个栗子: 事务最经典常用的栗子可能就是转账:一个账户少钱了,哪另一个账户肯定要多钱,李永龙说过,亏本的买卖咱可不干,吃亏了不高兴! 所以,少钱和多钱这两个操作,要么同时成功,要么同时失败! MySQL中如何开启事务? 手工开启:begin/s...

程序猿杂货铺 304
上一篇: Hermes 搭建 Karpathy LLM Wiki:进阶版
下一篇: 一条SQL执行过程:从查询到结果的奇幻之旅
路飞说AI
博客等级 码龄10年 214粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值