MySQL 数据库 Read View 详解
- [一、Read View 是什么?](#一、Read View 是什么?)
- [二、Read View 的 4 个核心字段(逐个拆)](#二、Read View 的 4 个核心字段(逐个拆))
- [三、可见性判断的"3 步算法"(超重要)](#三、可见性判断的“3 步算法”(超重要))
- 四、完整时间线推演
-
- 事务时间线
-
- [Read View 内容(在 T5)](#Read View 内容(在 T5))
- 判断不同版本是否可见
-
- [行版本 A:trx_id = 99](#行版本 A:trx_id = 99)
- [行版本 B:trx_id = 101](#行版本 B:trx_id = 101)
- [行版本 C:trx_id = 102](#行版本 C:trx_id = 102)
- [行版本 D:trx_id = 104](#行版本 D:trx_id = 104)
- [行版本 E:trx_id = 100(自己)](#行版本 E:trx_id = 100(自己))
- 最终结果
- [五、RC vs RR 在 Read View 上的关键区别](#五、RC vs RR 在 Read View 上的关键区别)
- [六、3 句口诀(秒记)](#六、3 句口诀(秒记))
- 七、一个常见误区(重要)
- 八、一句话总结
一、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