news 2026/4/23 11:31:50

ReadView的结构和工作原理?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ReadView的结构和工作原理?

你想深入掌握 Read View 的结构和工作原理,这是理解 MVCC 快照读的核心 ——Read View 就像 MVCC 的 “版本安检员”,决定了当前事务能看到版本链中的哪个版本。接下来我会先拆解 Read View 的核心结构,再用通俗的逻辑 + 实例讲清它的工作原理,让你彻底吃透。

一、Read View 的核心结构(4 个关键参数)

Read View 是 InnoDB 在事务执行快照读时生成的一个 “版本可见性判断规则集”,本质是一个内存数据结构,包含 4 个不可变的核心参数:

参数名中文含义作用
m_ids活跃事务 ID 列表记录生成 Read View 时,当前数据库中所有未提交的事务 ID(即 “活跃事务”)
min_trx_id最小活跃事务 IDm_ids中的最小值,是判断版本可见性的 “下限”
max_trx_id下一个分配的事务 ID系统即将分配的下一个事务 ID(大于当前所有已分配的事务 ID),是 “上限”
creator_trx_id创建 Read View 的事务 ID生成这个 Read View 的当前事务 ID(即 “自己” 的事务 ID)

补充说明

  • 事务 ID 是 InnoDB 全局递增的唯一编号,新事务的 ID 永远比旧事务大;
  • Read View 生成后,这 4 个参数就固定不变(可重复读隔离级别下),不会随其他事务提交 / 开启变化。

二、Read View 的工作原理(核心判断规则)

Read View 的核心作用是:遍历版本链时,判断某个版本是否对当前事务 “可见”

它的判断逻辑是一套 “自上而下” 的规则,针对版本链中某个版本的DB_TRX_ID(该版本的创建事务 ID):

核心判断规则(优先级从高到低)
  1. 自己修改的版本,永远可见如果版本的 DB_TRX_ID = creator_trx_id(当前事务自己修改的版本),直接判定为可见。→ 比如事务 101 自己更新了数据,它的快照读能看到自己修改的版本。

  2. 已提交事务的版本,可见如果版本的 DB_TRX_ID < min_trx_id(创建该版本的事务,在生成 Read View 时已经提交),判定为可见。→ 比如min_trx_id=102,版本的DB_TRX_ID=101(事务 101 已提交),这个版本对当前事务可见。

  3. 未来事务的版本,不可见如果版本的 DB_TRX_ID >= max_trx_id(创建该版本的事务,在生成 Read View 时尚未创建),判定为不可见。→ 比如max_trx_id=105,版本的DB_TRX_ID=106(事务 106 是 “未来” 的),这个版本还没产生,自然不可见。

  4. 活跃事务的版本,不可见如果min_trx_id ≤ 版本的 DB_TRX_ID < max_trx_id,且版本的 DB_TRX_ID 在 m_ids 列表中(创建该版本的事务还没提交),判定为不可见;反之,如果版本的 DB_TRX_ID 不在 m_ids 列表中(事务已提交),则可见。→ 比如m_ids=[102,103],版本的DB_TRX_ID=102(在列表中,未提交)→ 不可见;DB_TRX_ID=104(不在列表中,已提交)→ 可见。

规则执行流程(配合版本链)

当事务执行快照读时,Read View 会按以下步骤找 “可见版本”:

三、Read View 生成时机(隔离级别影响)

Read View 的生成时机直接决定了 “可重复读” 和 “读已提交” 的差异,这是面试高频考点:

隔离级别Read View 生成时机效果
可重复读(RR)事务中第一次执行快照读时生成,后续复用整个事务内多次快照读用同一个 Read View,保证 “可重复读”(结果一致)
读已提交(RC)每次执行快照读时都生成新的Read View每次读都用最新的活跃事务列表判断,能看到其他事务刚提交的版本(不可重复读)

四、实例演示(Read View + 版本链 联动)

沿用之前的例子:user表 id=1 的版本链为:当前版本(102: 王五)→ 历史版本1(101: 李四)→ 历史版本2(0: 张三)

场景:事务 103 执行快照读(可重复读隔离级别)
  • 生成 Read View 时,活跃事务列表m_ids=[103]min_trx_id=103max_trx_id=104creator_trx_id=103
  • 第一步:判断当前版本(102: 王五)的DB_TRX_ID=102 < min_trx_id=103→ 可见?→ 是!直接返回 “王五”。
场景:事务 104 在事务 102 未提交时执行快照读
  • 生成 Read View 时,活跃事务列表m_ids=[102,104]min_trx_id=102max_trx_id=105creator_trx_id=104
  • 第一步:判断当前版本(102: 王五)的DB_TRX_ID=102→ 在m_ids中(未提交)→ 不可见;
  • 第二步:遍历版本链,读取历史版本 1(101: 李四)→DB_TRX_ID=101 < min_trx_id=102→ 可见;
  • 结果:返回 “李四”。

总结

  1. Read View 核心结构:由m_idsmin_trx_idmax_trx_idcreator_trx_id4 个参数组成,是版本可见性的判断规则;
  2. 工作原理:通过对比版本的DB_TRX_ID和 Read View 参数,遍历版本链找到第一个可见版本;
  3. 关键差异:可重复读(RR)复用 Read View,读已提交(RC)每次生成新的,这是二者隔离性差异的核心原因。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 4:06:56

Chart.js 柱形图

Chart.js 柱形图 概述 Chart.js 是一个基于 HTML5 Canvas 的图表库,它能够帮助开发者轻松地创建各种图表,包括柱形图、折线图、饼图等。柱形图是一种常用的数据可视化工具,能够直观地展示不同类别之间的数量对比。本文将详细介绍 Chart.js 柱形图的使用方法、特点以及应用…

作者头像 李华
网站建设 2026/4/20 14:00:01

Memcached 连接:深入理解与优化实践

Memcached 连接:深入理解与优化实践 引言 Memcached 是一种高性能的分布式内存对象缓存系统,它能够存储键值对,广泛应用于减轻数据库负载、提高系统响应速度等方面。在Memcached的应用中,连接的建立和维护是至关重要的。本文将深入探讨Memcached连接的原理、优化策略以及…

作者头像 李华
网站建设 2026/4/20 11:01:49

Katalon StudioAssist智能故障分析

在软件测试过程中&#xff0c;最耗费时间的环节之一往往是分析测试失败的原因。面对冗长且充满技术术语的堆栈跟踪信息&#xff0c;测试人员需要逐行排查&#xff0c;不仅效率低下&#xff0c;也对经验有较高要求。Katalon Studio 自10.4.0版本起&#xff0c;推出了一项名为 AI…

作者头像 李华
网站建设 2026/4/18 19:53:56

泳池水质检测原理和硬件设备介绍

为了保障游泳者的健康与安全&#xff0c;泳池水质的实时监测至关重要。现代泳池水质检测系统通常基于自动化、连续化的技术方案&#xff0c;实现对多项水质指标的实时采集与分析&#xff0c;确保水质始终符合卫生标准。一、检测指标与意义泳池水质检测主要关注以下几类指标&…

作者头像 李华
网站建设 2026/4/18 5:28:16

ionic 颜色:设计与开发的色彩运用指南

ionic 颜色:设计与开发的色彩运用指南 引言 在移动应用开发领域,Ionic框架因其跨平台特性和丰富的组件库而备受开发者青睐。色彩作为界面设计的重要组成部分,对于提升用户体验和品牌形象具有至关重要的作用。本文将深入探讨Ionic框架中的颜色运用,为开发者提供色彩设计的…

作者头像 李华
网站建设 2026/4/20 21:18:37

Vue3 表单

Vue3 表单 随着前端技术的发展,Vue.js 已经成为了前端开发中非常流行的框架之一。Vue3 作为 Vue.js 的最新版本,在性能、易用性和灵活性方面都有很大的提升。本文将详细介绍 Vue3 中的表单处理,包括表单的创建、验证、双向绑定等。 1. 表单的创建 在 Vue3 中,我们可以使…

作者头像 李华