MySQL 数据库 Read View 详解

MySQL 数据库 Read View 详解

一、Read View 是什么?

Read View 是 InnoDB 在执行快照读时生成的一份"事务可见性规则表",用来判断某一行的哪个版本对当前事务可见。

📌 生成时机:

  • RC:每条普通 SELECT 都生成一个新的 Read View
  • RR :事务中 第一次普通 SELECT 时生成,后续复用

二、Read View 的 4 个核心字段(逐个拆)

1️⃣ creator_trx_id(创建者事务 ID)

含义

创建这个 Read View 的事务 ID(也就是当前事务)

作用

  • 自己改的数据,自己一定能看到
  • 防止"看不到自己刚写的数据"

判断规则

text 复制代码
如果 trx_id == creator_trx_id → 可见

2️⃣ m_ids(活跃事务列表)⭐重点

含义

在 Read View 创建时,系统中还没提交的事务 ID 集合

例如:

复制代码
m_ids = [100, 102, 105]

表示:

  • 这 3 个事务还在跑
  • 它们改的数据 不应该被看到

判断规则

text 复制代码
如果 trx_id ∈ m_ids → 不可见

3️⃣ min_trx_id(最小活跃事务 ID)

含义

m_ids 中最小的事务 ID

例如:

复制代码
m_ids = [100, 102, 105]
min_trx_id = 100

判断规则

text 复制代码
如果 trx_id < min_trx_id → 可见

📌 原因:

  • 比最早活跃事务还早
  • 一定已经提交

4️⃣ max_trx_id(下一个将分配的事务 ID)

含义

系统将要分配的下一个事务 ID(不是最大活跃事务)

例如:

复制代码
当前最大事务 ID = 110
max_trx_id = 111

判断规则

text 复制代码
如果 trx_id >= max_trx_id → 不可见

📌 原因:

  • 属于"未来事务"
  • Read View 创建时还不存在

三、可见性判断的"3 步算法"(超重要)

当你读到一行数据,拿到它的 trx_id

第一步:是不是自己?

text 复制代码
trx_id == creator_trx_id → 可见

第二步:是不是"太老"?

text 复制代码
trx_id < min_trx_id → 可见

第三步:是不是"活着或未来"?

text 复制代码
trx_id ∈ m_ids → 不可见
trx_id ≥ max_trx_id → 不可见

否则:

text 复制代码
可见

四、完整时间线推演

事务时间线

时间 事务 事件
T1 TX:100 START
T2 TX:101 START
T3 TX:101 UPDATE row
T4 TX:102 START
T5 TX:100 第一次 SELECT(生成 Read View)

Read View 内容(在 T5)

复制代码
creator_trx_id = 100
m_ids = [101, 102]
min_trx_id = 101
max_trx_id = 103

判断不同版本是否可见

行版本 A:trx_id = 99

复制代码
99 < min_trx_id(101) → 可见 ✅

行版本 B:trx_id = 101

复制代码
101 ∈ m_ids → 不可见 ❌

行版本 C:trx_id = 102

复制代码
102 ∈ m_ids → 不可见 ❌

行版本 D:trx_id = 104

复制代码
104 ≥ max_trx_id(103) → 不可见 ❌

行版本 E:trx_id = 100(自己)

复制代码
trx_id == creator_trx_id → 可见 ✅

最终结果

👉 当前事务 只能看到

  • trx_id < 101 的版本
  • 自己改的版本

五、RC vs RR 在 Read View 上的关键区别

项目 RC RR
Read View 生成 每条 SELECT 第一次 SELECT
同一事务多次读 可能不同 一定相同
可重复读

📌 RC 下"每次刷新世界观",RR 下"一次定终身"


六、3 句口诀(秒记)

自己可见;
活跃不可见;
早于最早活跃的都可见。


七、一个常见误区(重要)

Read View ≠ 表快照

  • 它不是复制数据
  • 只是 一套判断规则
  • 数据仍然来自当前页 + undo log

八、一句话总结

Read View 通过 creator_trx_id + m_ids + min_trx_id + max_trx_id 四个字段,精确决定了事务在快照读时能看到哪一个版本的数据。

若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/156259804

相关推荐
xiaowu0807 分钟前
C# 拆解 “显式接口实现 + 子类强类型扩展” 的设计思想
数据库·oracle
讯方洋哥21 分钟前
HarmonyOS App开发——关系型数据库应用App开发
数据库·harmonyos
惊讶的猫1 小时前
Redis持久化介绍
数据库·redis·缓存
Apple_羊先森1 小时前
ORACLE数据库巡检SQL脚本--19、磁盘读次数最高的前5条SQL语句
数据库·sql·oracle
全栈前端老曹2 小时前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
神梦流2 小时前
ops-math 算子库的扩展能力:高精度与复数运算的硬件映射策略
服务器·数据库
让学习成为一种生活方式2 小时前
trf v4.09.1 安装与使用--生信工具42-version2
数据库
啦啦啦_99992 小时前
Redis-5-doFormatAsync()方法
数据库·redis·c#
生产队队长2 小时前
Redis:Windows环境安装Redis,并将 Redis 进程注册为服务
数据库·redis·缓存
老邓计算机毕设2 小时前
SSM找学互助系统52568(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·javaweb 毕业设计