侧边栏壁纸
博主头像
米老鼠吃薯片 博主等级

行动起来,活在当下

  • 累计撰写 8 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

2.mvcc详解

Administrator
2026-04-28 / 0 评论 / 0 点赞 / 2 阅读 / 0 字

作用

实现rc和rr的隔离级别

1. 一致性视图

1.1 组成部分

1.creator_trx_id 创建当前ReadView的事务id
2.m_ids 创建视图时的活跃事务id集合 -- 活跃事务:还未提交的事务
3.min_trx_id 最小活跃事务id -- m_ids中的最小者
4.max_trx_id 创建ReadView时,最大事务id+1

1.2 数据版本可见性判定

当一个数据版本的trx_id

  -- 可见
  < min_trx_id 时:表示在创建ReadView时,该事务已提交

  -- 可见
  = creator_trx_id :表示该版本的数据为自己修改的

  -- 可见
  not in m_ids :表示在创建ReadView时,该事务已提交

  -- 不可见
  > max_trx_id :表示在创建ReadView时,该事务未创建

  -- 不可见
  in m_ids :表示在创建当前ReadView时,该事务未提交

1.3 创建ReadView的时机

读已提交 (rc) :在每一次select语句时

可重复读(rr)

情况1. 在普通开启事务且第一条select语句执行
情况2. 使用 START TRANSACTION WITH CONSISTENT SNAPSHOT;语句,开启事务并立刻创建ReadView

2.undolog

2.1 数据版本

一行数据会有与mvcc有关的隐形字段:
  trx_id       最后一次修改这行记录的事务 ID
  roll_pointer 指向上一版本 undo log 的指针

2.2 作用

1.回滚事务
2.计算前一个版本数据,根据ReadView和数据的trx_id寻找可见性版本数据

3.mvcc整体逻辑

通过ReadView的机制判定可见的数据版本,从最新的数据版本trx_id开始判定,如果不符合可见性,就使用undolog计算前一个版本的数据和trx_id,如此循环直到找到可见的版本数据

0

评论区