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

相关推荐
温暖小土4 小时前
ClickHouse vs Apache Doris:2026年实时OLAP数据库选型深度解析
数据库·数据仓库·clickhouse·apache
专注数据的痴汉4 小时前
「数据获取」全国民用运输机场吞吐量排名(2006-2024)
java·大数据·服务器·数据库·信息可视化
海边的椰子树4 小时前
非常方便的MySQL迁移数据ClickHouse工具
数据库·mysql·clickhouse·迁移
yongui478345 小时前
使用C#实现Excel实时读取并导入SQL数据库
数据库·c#·excel
ryy10255063195 小时前
Springboot+Mysql 图书管理系统【源码+sql】
spring boot·sql·mysql
JZC_xiaozhong5 小时前
分析型数据库 ClickHouse 在数据中台中的集成
大数据·数据库·clickhouse·架构·数据一致性·数据孤岛解决方案·数据集成与应用集成
航Hang*5 小时前
第3章:复习篇——第3节:数据查询与统计---题库
数据库·笔记·sql·学习·mysql·期末·复习
廋到被风吹走5 小时前
【数据库】【MySQL】事务隔离深度解析:MVCC 实现与幻读解决机制
android·数据库·mysql
Star Learning Python5 小时前
MySQL面试的基础知识
数据库·sql
知识分享小能手5 小时前
Oracle 19c入门学习教程,从入门到精通,Oracle管理工具 —— 知识点详解(3)
数据库·学习·oracle