Read View在MVCC里如何工作

Read View的结构

Read View中有四个重要的字段:

  • m_ids:创建 Read View 时,数据库中启动但未提交的「活跃事务」的事务 id 列表 。
  • min_trx_id:创建 Read View 时,「活跃事务」中事务 id 最小的值,即 m_ids 中的最小值 。
  • max_trx_id:创建 Read View 时,数据库中应分配给下一个事务的 id 值,为全局事务最大事务 id 值 + 1 。
  • creator_trx_id:创建该 Read View 的事务的事务 id 。

聚簇索引记录的两个隐藏列

了解到Read View的字段,我们需要了解聚簇索引记录的两个隐藏列。

对于InnoDB存储引擎的数据库表,它的聚簇索引记录都包含下面两个隐藏列:

  • trx_id,当一个事务对某条聚簇索引记录进行改动时,就会把事务的事务id记录在trx_id隐藏列里;
  • rool_pointer,每次对某条聚簇索引记录进行改动时,都会把旧版本的记录写入到undo日志中,然后把隐藏列是指针,指向每一个旧版记录,于是就可以通过它找到修改前的记录;

在创建的Read View中,我们可以将记录中的trx_id划分这三种情况:

一个事务去访问记录的时候,除了自己的更新记录总是可见之外,还有这个几种情况:

判断规则

  • trx_id 小于 min_trx_id:此记录版本由在创建 Read View 前已提交的事务生成,对当前事务可见。
  • trx_id 大于等于 max_trx_id :该记录版本由在创建 Read View 后启动的事务生成,对当前事务不可见。
  • trx_id 在 min_trx_id 和 max_trx_id 之间
    • trx_id 在 m_ids 列表中:生成该版本记录的事务仍活跃(未提交) ,对当前事务不可见。
    • trx_id 不在 m_ids 列表中:生成该版本记录的事务已提交 ,对当前事务可见

这种通过版本链来控制并发事务访问同一个记录时的行为就叫MVCC(多版本并发控制)

相关推荐
feifeigo1235 分钟前
升级到MySQL 8.4,MySQL启动报错:io_setup() failed with EAGAIN
数据库·mysql·adb
火龙谷2 小时前
【nosql】有哪些非关系型数据库?
数据库·nosql
焱焱枫2 小时前
Oracle获取执行计划之10046 技术详解
数据库·oracle
qq_392397124 小时前
Redis常用操作
数据库·redis·wpf
一只fish6 小时前
MySQL 8.0 OCP 1Z0-908 题目解析(17)
数据库·mysql
花好月圆春祺夏安6 小时前
基于odoo17的设计模式详解---装饰模式
数据库·python·设计模式
A__tao6 小时前
SQL 转 Java 实体类工具
java·数据库·sql
m0_653031366 小时前
腾讯云认证考试报名 - TDSQL数据库交付运维专家(TCCE PostgreSQL版)
运维·数据库·腾讯云
小马哥编程7 小时前
【iSAQB软件架构】架构决策记录-ADR
数据库·架构·系统架构·设计规范
萧鼎7 小时前
深度探索 Py2neo:用 Python 玩转图数据库 Neo4j
数据库·python·neo4j