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

相关推荐
Elastic 中国社区官方博客3 小时前
Elasticsearch:圣诞晚餐 BBQ - 图像识别
大数据·数据库·elasticsearch·搜索引擎·ai·全文检索
cui_win3 小时前
Prometheus实战教程 - Redis 监控
数据库·redis·prometheus
JIngJaneIL4 小时前
基于java + vue个人博客系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
TG:@yunlaoda360 云老大4 小时前
华为云国际站代理商备份策略设置过程中遇到问题如何解决?
服务器·数据库·华为云
SelectDB4 小时前
Doris Catalog 已上线!性能提升 200x,全面优于 JDBC Catalog,跨集群查询迈入高性能分析时代
数据库·数据分析·apache
TAEHENGV4 小时前
进度跟踪模块 Cordova 与 OpenHarmony 混合开发实战
android·javascript·数据库
神秘面具男034 小时前
MySQL 从基础到实践
数据库·mysql
2301_767902646 小时前
MySQL 入门
数据库·mysql
7ioik6 小时前
说一说MySQL数据库基本架构?
数据库·mysql·架构