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

相关推荐
全栈老石3 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_21 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
于眠牧北2 天前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12024 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker