当前位置: 首页 > article >正文

mysql中mvcc如何处理纯读事务的?

在 MySQL 的 InnoDB 中,即使事务尚未分配事务 ID,读视图(Read View) 的生成仍然依赖于系统中的活跃事务列表。这是通过 MVCC 的机制来实现的,以下是具体的原理和可见性判断方法。


MVCC 的核心概念

在 MVCC 中,每一行记录都有两个隐藏的版本控制字段:

  1. trx_id(事务 ID):记录最后修改该行的事务 ID。
  2. roll_pointer:指向 Undo Log 的指针,用于回溯到上一版本数据。
活跃事务列表

当一个事务开始并生成 Read View 时,InnoDB 会获取当前系统中活跃事务的快照,包括:

  1. min_trx_id:系统中仍未提交的最小事务 ID。
  2. max_trx_id:系统中尚未分配的下一个事务 ID(逻辑上的“最大事务 ID”)。
  3. 活跃事务集合 (active_trx_ids):当前系统中所有未提交的事务 ID 列表。

这些信息被保存为 Read View,决定了当前事务能够看到的数据版本。


没有事务 ID 的事务如何判断可见性

即使事务没有分配事务 ID(例如纯读事务),Read View 的生成机制依然可以运作,具体如下:

可见性规则

对于每一行记录的 trx_id(记录最后修改该行的事务 ID),Read View 会通过以下规则判断该行是否可见:

  1. 当前事务的写入是否可见:

    • 如果 trx_id 小于 min_trx_id:表示该事务在当前事务启动之前已经提交,因此该版本是可见的。
    • 如果 trx_id 大于或等于 max_trx_id:表示该版本是未来的修改版本,对当前事务不可见。
  2. 当前事务的并发写入是否可见:

    • 如果 trx_id[min_trx_id, max_trx_id) 区间内:
      • 检查 active_trx_ids 中是否包含该 trx_id
      • 如果包含,表示该事务仍未提交,对当前事务不可见。
      • 如果不包含,表示该事务已经提交,该版本是可见的。

事务未分配事务 ID 的特殊处理

对于未分配事务 ID 的事务:

  • 它的 Read View 的创建仅依赖系统中的活跃事务列表 (active_trx_ids)。
  • 判断可见性时,当前事务没有事务 ID,因此不会参与 active_trx_ids 的比较,完全基于其他事务的状态来判断可见性。

这种设计确保了即使是纯读事务,也能通过 Read View 保证一致性。


总结

即使事务没有分配事务 ID,它的 Read View 是基于快照生成的,使用以下机制判断数据版本的可见性:

  1. 通过 trx_idmin_trx_idmax_trx_id 的比较。
  2. 通过 active_trx_ids 判断未提交的并发事务。 这套机制确保了任何事务都能正确判断数据的可见性,无论事务是否分配了事务 ID。

http://www.kler.cn/a/403113.html

相关文章:

  • VSCode【下载】【安装】【汉化】【配置C++环境】【运行调试】(Windows环境)
  • ABAP开发-CO的底层表-物料价格分析CKM3
  • 如何复制只读模式下的腾讯文档
  • 数据库表设计范式
  • 【数据结构】【线性表】【练习】反转链表
  • 【vba源码】导入excel批注信息
  • 《数据结构》学习系列——图(上)
  • 如何控制自己玩手机的时间?两台苹果手机帮助自律
  • JDBC使用p6spy记录实际执行SQL方法【解决SQL打印两次问题】
  • AWS 多区域部署实战:Route 53 加权路由与多层健康检查
  • 反转链表、链表内指定区间反转
  • 10 基于深度学习的目标检测
  • Redis 集群主要有以下几种类型
  • 【Android原生问题分析】夸克、抖音划动无响应问题【Android14】
  • 2. Django中的URL调度器 (自定义路径转换器)
  • Windows Server 2022 Web1
  • misc设备驱动
  • [系统安全]PE文件头中的重定位表
  • springboot-事务失效以及排查过程
  • wife_wife
  • 设计探测1飞伏的装置可能吗?
  • gitlab ci/cd搭建及使用笔记(三)
  • 常见协议所对应的漏洞
  • 如何在 Ubuntu 上使用 Docker 部署 LibreOffice Online
  • 基于isSpring的PPT转换
  • 计算机视觉中的双边滤波:经典案例与Python代码解析