news 2026/4/23 10:48:33

MySQL,InnoDB快照读,在RR和RC下有何差异?(第10讲,超硬核)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL,InnoDB快照读,在RR和RC下有何差异?(第10讲,超硬核)

《数据库架构100讲》

10. InnoDB快照读

先简单解释下快照读读提交可重复读

快照读(Snapshot Read)

MySQL数据库,InnoDB存储引擎,为了提高并发,使用MVCC机制,在并发事务时,通过读取数据行的历史数据版本,不加锁,来提高并发的一种不加锁一致性读(Consistent Nonlocking Read)。

读提交(Read Committed)

1. 数据库领域,事务隔离级别的一种,简称RC;

2. 它解决“读脏”问题,保证读取到的数据行都是已提交事务写入的;

3. 它可能存在“读幻影行”问题,同一个事务里,连续相同的read可能读到不同的结果集;

可重复读(Repeated Read)

1. 数据库领域,事务隔离级别的一种,简称RR;

2. 它不但解决“读脏”问题,还解决了“读幻影行”问题,同一个事务里,连续相同的read读到相同的结果集;

读提交(RC),可重复读(RR)两个不同的事务的隔离级别下,快照读有什么不同呢?

先说结论

1. 事务总能够读取到,自己写入(update /insert /delete)的行记录;

2. RC下,快照读总是能读到最新的行数据快照,当然,必须是已提交事务写入的;

3. RR下,某个事务首次read记录的时间为T,未来不会读取到T时间之后已提交事务写入的记录,以保证连续相同的read读到相同的结果集;

画外音:可以看到

(1)和并发事务的开始时间没关系,和事务首次read的时间有关;

(2)由于不加锁,和互斥关系也不大;

举例说明,InnoDB表:

t(id PK, name);

表中有三条记录:
1, shenjian
2, zhangsan
3, lisi

case 1,两个并发事务A,B执行的时间序列如下(A先于B开始,B先于A结束):

A1: start transaction;
B1: start transaction;
A2: select * from t;
B2: insert into t values (4, wangwu);
A3: select * from t;
B3: commit;
A4: select * from t;

提问1:假设事务的隔离级别是可重复读RR,事务A中的三次查询,A2, A3, A4分别读到什么结果集?

回答:RR下

(1)A2读到的结果集肯定是{1, 2, 3},这是事务A的第一个read,假设为时间T;

(2)A3读到的结果集也是{1, 2, 3},因为B还没有提交;

(3)A4读到的结果集还是{1, 2, 3},因为事务B是在时间T之后提交的,A4得读到和A2一样的记录;


提问2:假设事务的隔离级别是读提交RC,A2, A3, A4又分别读到什么结果集呢?

回答:RC下

(1)A2读到的结果集是{1, 2, 3};

(2)A3读到的结果集也是{1, 2, 3},因为B还没有提交;

(3)A4读到的结果集还是{1, 2, 3, 4},因为事务B已经提交;

case 2,仍然是上面的两个事务,只是A和B开始时间稍有不同(B先于A开始,B先于A结束):

B1: start transaction;

A1: start transaction;

A2: select * from t;
B2: insert into t values (4, wangwu);
A3: select * from t;
B3: commit;
A4: select * from t;

提问3:假设事务的隔离级别是可重复读RR,事务A中的三次查询,A2, A3, A4分别读到什么结果集?

提问4:假设事务的隔离级别是读提交RC,A2, A3, A4的结果集又是什么呢?

回答:事务的开始时间不一样,不会影响“快照读”的结果,所以结果集和case 1一样。

case 3,仍然是并发的事务A与B(A先于B开始,B先于A结束):

A1: start transaction;
B1: start transaction;
B2: insert into t values (4, wangwu);
B3: commit;
A2: select * from t;

提问5:假设事务的隔离级别是可重复读RR,事务A中的A2查询,结果集是什么?

提问6:假设事务的隔离级别是读提交RC,A2的结果集又是什么呢?

回答:在RR下,

A2是事务A的第一个read,假设为时间T,它能读取到T之前提交事务写入的数据行,故结果集为{1, 2, 3, 4}。在RC下,没有疑问,一定是{1, 2, 3, 4}。

case 4,事务开始的时间再换一下(B先于A开始,B先于A结束):

B1: start transaction;

A1: start transaction;

B2: insert into t values (4, wangwu);

B3: commit;
A2: select * from t;

提问7:假设事务的隔离级别是可重复读RR,事务A中的A2查询,结果集是什么?

提问8:假设事务的隔离级别是读提交RC,A2的结果集又是什么呢?

回答:事务的开始时间不一样,不会影响“快照读”的结果,所以结果集和case 3一样。

啰嗦说了这么多,最后总结

1. RR下,事务在第一个Read操作时,会建立Read View;

2. RC下,事务在每次Read操作时,都会建立Read View;

知其然,知其所以然。

思路比结论更重要。

==全文完==

有架构合集吗?

《流量从10万到10亿,80个架构问题》

《关于即时通讯架构的一切!》

Q4内测了一个新产品,看普通人起号能否复制:

《复盘来了,4周,人均41W+》

内测成绩不错,4周的时间人群你全网流量41W+,本周日二期直播开营,点击阅读原文一起参与!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 9:42:24

HY-MT1.5-1.8B部署教程:Kubernetes集群运行方案

HY-MT1.5-1.8B部署教程:Kubernetes集群运行方案 1. 引言 1.1 背景与目标 随着多语言内容在全球范围内的快速增长,高效、低成本的神经机器翻译(NMT)模型成为企业出海、本地化服务和跨语言信息处理的核心基础设施。传统大模型虽然…

作者头像 李华
网站建设 2026/4/16 15:08:38

没显存也能玩AI?Fun-ASR-Nano-2512云端体验2GB显存都不用

没显存也能玩AI?Fun-ASR-Nano-2512云端体验2GB显存都不用 你是不是也遇到过这样的尴尬:想带学生做点AI小实验,结果一看电脑配置——集成显卡,共享显存还不到1GB。别提跑模型了,连很多AI工具的安装包都打不开。这正是某…

作者头像 李华
网站建设 2026/4/5 14:59:15

AI医疗影像预处理:GPEN在病历照片增强中的尝试案例

AI医疗影像预处理:GPEN在病历照片增强中的尝试案例 1. 技术背景与应用场景 随着电子病历系统的普及,越来越多的医疗机构开始将纸质病历、手写记录、患者自拍或扫描件等非标准图像资料数字化。然而,这些图像普遍存在分辨率低、光照不均、模糊…

作者头像 李华
网站建设 2026/4/19 17:36:50

ComfyUI移动端方案:手机远程操控云端GPU随时创作

ComfyUI移动端方案:手机远程操控云端GPU随时创作 你是不是也经常在通勤路上、午休间隙或排队等餐时,突然冒出一个绝妙的AI绘画创意?但一想到要回家打开高性能电脑才能操作ComfyUI,灵感就凉了一半。别担心,这正是我们今…

作者头像 李华
网站建设 2026/4/12 2:29:16

三菱FX系列PLC称重包装秤案例该项目已投入正常生产中。 程序有近千步,包括标零标分度,快慢速...

三菱FX系列PLC称重包装秤案例该项目已投入正常生产中。 程序有近千步,包括标零标分度,快慢速结合配料等功能。 涉及大量模拟量及逻辑控制运用,适合PLC爱好者学习 内容包括:1.三菱PLC程序2.三菱触摸屏程序3.电气原理图4.控制说明文…

作者头像 李华
网站建设 2026/4/21 22:56:20

从零开始:Sambert多情感语音合成快速入门指南

从零开始:Sambert多情感语音合成快速入门指南 1. 学习目标与前置知识 本文旨在为开发者和AI爱好者提供一份完整的 Sambert 多情感中文语音合成技术入门教程。通过本指南,您将掌握以下技能: 理解 Sambert-HiFiGAN 模型的基本架构与工作原理…

作者头像 李华