Mysql:Read View

在 MySQL InnoDB 中,Read View(读视图)是 MVCC 用来判断"某个数据版本对当前查询是否可见"的规则集合。

它可以理解为查询创建的一张"事务快照名单",但要注意:

Read View 并不会复制整张表,也不保存数据本身,它只记录事务可见性的边界信息。

普通 SELECT 可以借助 Read View 读取历史版本,不必等待其他事务提交,也通常不需要加行锁

为什么需要 Read View

假设一行数据正在被其他事务修改:

复制代码
事务 A:把 balance 从 100 修改为 200,但还没有提交
事务 B:执行 SELECT 查询 balance

事务 B 不能随便看到未提交的 200,否则会产生脏读。

InnoDB 会通过以下信息决定读取哪个版本:

复制代码
Read View + 数据行的事务 ID + Undo Log 版本链

Read View 记录什么

可以简化理解为四部分:

复制代码
creator_trx_id:创建 Read View 的事务 ID
active_trx_ids:创建时仍然活跃、未提交的事务 ID
min_trx_id:活跃事务中的最小事务 ID
max_trx_id:创建时下一个将被分配的事务 ID

MySQL 源码中的具体字段名称略有不同,但核心就是:记录创建快照时哪些事务尚未完成,以及事务 ID 的上下边界。

可见性判断规则

假设 Read View 创建时:

复制代码
当前事务 ID:105
活跃事务:100、108
最小活跃事务 ID:100
下一个事务 ID:110

检查某个数据版本的 DB_TRX_ID 时:

1. 是当前事务自己修改的

复制代码
DB_TRX_ID = 105

可见,因为事务应该看到自己之前的修改。

2. 小于最小活跃事务 ID

复制代码
DB_TRX_ID = 90

可见。

说明修改这个版本的事务在 Read View 创建之前就已经提交。

3. 大于等于下一个事务 ID

复制代码
DB_TRX_ID >= 110

不可见。

说明修改数据的事务是在 Read View 创建之后才开始的,相当于"未来事务"。

4. 位于两个边界之间

例如:

复制代码
DB_TRX_ID = 103

需要检查活跃事务列表:

在活跃事务列表中:当时尚未提交,不可见。

不在活跃事务列表中:当时已经提交,可见。

整体规则可以概括为:

复制代码
是自己修改的                  → 可见
小于最小活跃事务 ID           → 可见
大于等于下一个事务 ID         → 不可见
处于两者之间且仍然活跃         → 不可见
处于两者之间但已经提交         → 可见

当前版本不可见怎么办

InnoDB 聚簇索引记录中包含两个隐藏字段:

复制代码
DB_TRX_ID:最后修改该行的事务 ID
DB_ROLL_PTR:指向 Undo Log 中的历史版本

如果当前记录对 Read View 不可见,InnoDB 会沿着 DB_ROLL_PTR 找到更旧的版本:

复制代码
最新版本:事务 108 修改,不可见
       ↓ Undo Log
旧版本:事务 103 修改,可见
       ↓
返回旧版本

这就是 MVCC 的多版本读取过程。MySQL 源码也会根据 Read View 检查记录事务 ID,并在版本不可见时通过 Undo Log 构造旧版本。

相关推荐
ClickHouseDB6 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906946 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
时间售卖铺7 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw7 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社8 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
lbb 小魔仙9 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
captain37610 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你021410 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川10 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组11 小时前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制