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

相关推荐
瀚高PG实验室1 小时前
pgsql-ogr-fdw
数据库·postgresql·瀚高数据库·highgo
IvorySQL1 小时前
PostgreSQL 技术日报 (6月5日)|PG19 Beta1 上线,PGConf.PL 2026开启征稿
数据库·postgresql·区块链
abcy0712131 小时前
pycharm python sqlalchemy mysql增删改查实例csdn
数据库·oracle
无风听海1 小时前
IndexedDB 深度指南 浏览器中的事务型对象数据库
前端·数据库
咋吃都不胖lyh2 小时前
langgraph基础示例
数据库
网管NO.13 小时前
子查询进阶|EXISTS/IN/ANY/ALL,优化查询效率
数据库·sql
云服务器租用费用3 小时前
2026年腾讯云OpenClaw(Clawdbot)+Skills云上部署及Windows本地集成轻松入门
运维·服务器·数据库·windows·云计算·腾讯云
AllData公司负责人4 小时前
大模型赋能AllData数据中台,系列升级|通过联合智谱大模型与BiSheng开源项目,建设企业大模型应用开发平台,支持知识库向量检索!
大数据·数据结构·数据库·算法·大模型·向量数据库·智谱ai
Raink老师4 小时前
【AI面试临阵磨枪-94】Skill 安全:注入、越权、数据泄露、恶意代码、沙箱?
数据库·安全·面试
kkk哥4 小时前
weixin121作品集展示微信小程序
java·mysql·微信小程序·ssm·b/s架构·作品集展示微信小程序