MVCC的原理是什么?谈谈你的理解!

1. undolog多版本链

MVCC通过为每行数据项维护多个版本来实现并发控制。当一个事务对数据进行修改时,它不会直接覆盖现有的数据,而是创建一个新的版本。这些不能数据版本形成了单向版本链。

2. readview视图

readview组成:

  • 当前活跃的事务ID数组
  • 最小事务m_ids
  • 最大事务max_id
  • 当前事务creator_trx_id

3. readview创建时机

  • START TRANSACTION WITH CONSISTENT SNAPSHOT; 立即创建快照
  • Start Transaction 对于RR来说第一个select语句,对于RC来说每条select语句都会创建。

4. 可见性规则

  • 版本的事务ID小于m_ids:该版本在Read View创建之前已经提交,因此对当前事务可见。
  • 版本的事务ID大于max_id:该版本在Read View创建之后生成,因此对当前事务不可见。
  • 版本的事务ID在m_ids和max_id之间:如果版本的事务ID不在活跃事务列表中,则该版本已经提交,对当前事务可见。如果版本的事务ID在活跃事务列表中,则该版本尚未提交,对当前事务不可见

特别备注: 如果是当前事务creator_trx_id操作的数据,也是可见的!!

5. 快照读和当前读

  • 快照读:查询select语句属于快照读
  • 当前读: 删除更新类语句属于当前读,读的是数据库已经提交的数据

6. select数据是如何可见或者不可见的?

从undolog版本链的头部开始遍历,根据每个数据版本的事务ID,结合readview以及可见性的规则,来判定数据是否可见。

相关推荐
小码吃趴菜2 小时前
MySQL事务 视图 索引
数据库·mysql
LJianK12 小时前
select .. group by
java·数据库·sql
wWYy.2 小时前
详解redis(13):数据结构GEO
数据库·redis·缓存
程序员小白条2 小时前
面试 Java 基础八股文十问十答第二十一期
java·开发语言·数据库·面试·职场和发展
橘子133 小时前
MySQL表的约束(五)
android·mysql·adb
云草桑3 小时前
业务系统设计 权限系统 MAC、DAC、RBAC、ABAC 、核心概念(主体 / 客体 / 用户 - 角色 - 对象)、及数据权限
数据库·c#·权限·数据设计
小雨青年3 小时前
【鸿蒙原生开发会议随记 Pro】 增删改查 封装一个优雅的 SQLite 数据库单例
数据库·sqlite·harmonyos
zbguolei3 小时前
MySQL不兼容的字符集排序规则(collation)导致报错
数据库·mysql
tqs_123453 小时前
@transactional事务失效场景
java·数据库·mybatis