MVCC实现原理

MVCC的基本概念

MVCC,一个数据的多个版本,使得读写操作没有冲突。

在多个事务并发的情况下,确定到底要访问哪个版本。

MVCC实现原理

MVCC实现依赖于隐式字段,undo log日志,readView

隐式字段

在mysql用户自定义的字段后面,隐藏了MySQL提供好的3个隐藏字段

  • DB_TRX_ID:最近修改事务ID
  • DB_ROLL_PTR:指向回滚段中的undo log记录,指向上一个版本
  • DB_ROW_ID:隐藏主键(当表无主键时自动生成)

undo log日志

回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。

当insert的时候,产生的undolog日志只在回滚时需要,在事务提交后,可被立即删除。

而update、delete的时候,产生的undolog日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除。

undo log版本链

undo log日志 记录 数据修改前的值,形成版本链(相当于一个修改记录)

ReadView机制 事务执行时会生成ReadView

ReadView(读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

  • 当前读:读取的是最新版本,会加锁,读取时不会被修改。
  • 快照读:不加锁,读取的是记录数据的可见版本,可能是历史数据。

ReadView包含4个核心字段

  • m_ids:当前活跃事务ID集合,还未提交的 事务的集合。
  • min_trx_id:最小活跃事务ID
  • max_trx_id:预分配的下个事务ID,当前最大事务id+1(事务id是自增的)
  • creator_trx_id:创建该ReadView的事务ID

版本链 数据访问规则

DB_TRX_ID:最近修改的事务id

  1. 如果 DB_TRX_ID小于min_trx_id,说明该版本在ReadView创建前已提交,可访问

  2. 如果 DB_TRX_ID大于等于max_trx_id,说明该版本在ReadView创建后生成,不可访问

  3. 如果 DB_TRX_ID等于creator_trx_id,说明该版本由当前事务修改,可访问

  4. 如果 DB_TRX_IDm_ids列表中,说明该版本由未提交事务创建,不可访问

不同隔离级别,生成的ReadView的时机不一样

  • READ COMMITTED (RC):每次查询都生成新的ReadView,能看到其他事务已提交的修改。(每次查询时我都来判断:最新提交的事务是谁,我就读谁)
  • REPEATABLE READ (RR):仅在第一次查询时生成ReadView并复用,保证事务期间看到的数据版本一致。(第一查询,中间改动了,我还是复用第一次的查询,不能识别到中间改动了)
相关推荐
不羁。。1 小时前
【撸靶笔记】第七关:GET - Dump into outfile - String
数据库·笔记·oracle
yangchanghua1112 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance2 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai2 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql
在努力的前端小白3 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
未来之窗软件服务3 小时前
自建知识库,向量数据库 (九)之 量化前奏分词服务——仙盟创梦IDE
数据库·仙盟创梦ide·东方仙盟·自建ai·ai分词
麦兜*4 小时前
Swift + Xcode 开发环境搭建终极指南
开发语言·ios·swiftui·xcode·swift·苹果vision pro·swift5.6.3
萧鼎5 小时前
Python pyzmq 库详解:从入门到高性能分布式通信
开发语言·分布式·python
一叶飘零_sweeeet5 小时前
从繁琐到优雅:Java Lambda 表达式全解析与实战指南
java·lambda·java8
艾伦~耶格尔6 小时前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试