背景
MySQL的InnoDB引擎实现了多版本控制MVCC,其对RR和RC隔离级别提供了支持,RR和RC可以在快照读取数据,那InnoDB是如何支持快照读的呢?
MVCC 是如何操作的
童话里是这么说的
Select
InnoDB只查找版本小于或等于当前事务版本的数据行。确保事务读取到的行,要么是事务开始前就存在的,要么是事务自身插入或者修改的。
行的删除版本要么未定义,要么大于当前事务的版本。确保事务读取到的行,在事务开始之前未被删除。
行的删除版本要么未定义,要么大于当前事务的版本。确保事务读取到的行,在事务开始之前未被删除。
Insert
InnoDB为新插入的每一行保存当前系统版本号作为行版本号
Delete
InnoDB为删除的每一行保存当前系统版本号作为行删除标识
Update
InnoDB会插入一行新记录保存当前系统版本号作为行版本号,同时保存当前系统的版本号到原来的行作为行删除标识
思考:如果每创建一个事务,都保存当前时刻一份全量的快照的话,不考虑数据库能不能抗的住,上面这些操作有何意义?
MVCC的数据结构
MVCC两个基本的数据结构
行记录
Innodb引擎会为每一行添加3个字段实现的,DATA_TRX_ID、DATA_ROLL_PTR与DELETED_BIT:
DATA _TRX_ID表示产生当前记录项的事务ID(每开启一个新的事务,其对应的事务id会自动递增);
DATA_ROLL_PTR一个指向此条记录项的undo信息的指针,undo信息是指此条记录被修改前的信息;
DELETED_BIT位,用于标识该记录是否被删除。
DATA_ROLL_PTR一个指向此条记录项的undo信息的指针,undo信息是指此条记录被修改前的信息;
DELETED_BIT位,用于标识该记录是否被删除。
read view
RR读:每个事务在开始都会根据当前系统的活跃事务链表创建一个read_view,read_view是用来检索行的可见性的。
RC读:事务中,每个语句都会创建read_view。
假设当前的活跃事务链表如下所示:current-trx —> trx7 —> trx5 —> trx3 —> trx1;
Read View中的的变量则按如下方式初始化:
read_view->creator_trx_id = current-trx; 当前的事务id
read_view->up_limit_id = trx1; 当前活跃事务的最小id
read_view->low_limit_id = trx7; 当前活跃事务的最大id
read_view->trx_ids = [trx1, trx3, trx5, trx7]; 当前活跃的事务的id列表
read_view->m_trx_ids = 4; 当前活跃的事务id列表长度
read_view->up_limit_id = trx1; 当前活跃事务的最小id
read_view->low_limit_id = trx7; 当前活跃事务的最大id
read_view->trx_ids = [trx1, trx3, trx5, trx7]; 当前活跃的事务的id列表
read_view->m_trx_ids = 4; 当前活跃的事务id列表长度
以上是read view中变量组成,下面来分析一下快照的形成过程
相关推荐
07-VIP-深入理解MVCC与BufferPool缓存机制.pdf
深入理解MVCC与BufferPool缓存机制
这个文件涉及的主题是MVCC(多版本并发控制)的理解。MVCC是一种并发控制机制,常用于数据库系统中,旨在解决并发读写操作可能引发的数据一致性问题。它通过在数据库中保存多个版本的数据,使得读操作不会被写操作所...
53 理解MVCC机制的前奏:undo log版本链是个什么东西?l.pdf
MVCC机制举例
文档描述了PG 多版本的实现,简单快速的了解MVCC的机制
InnoDB事务-锁-MVCC.pdf
当你使用PostgreSQL来设计高并发的应用时,理解它的MVCC是怎么实现的很重要。它事实上是复杂问题的一种非常优雅和简单的解法。 MVCC如何工作 在Postgres中,每一个事务都会得到一个被称作为 XID 的事务ID。这里说的...
InnoDB引擎MVCC实现原理
InnoDB多版本并发控制机制MVCC的原理与实现,包括底层代码实现以及快照的构建原理。RR隔离级别和RC隔离级别的实现逻辑。
行业-53 理解MVCC机制的前奏:undo log版本链是个什么东西?l.rar
mvcc正确性测试方案设计.pdf
12 多版本并发控制原理(MVCC).pdf
MVCC多版本并发控制 MVCC实现原理等等
MVCC相关,自己总结的
事务原理MVCC、Readview和行锁原理分析直播中(1).zip事务原理MVCC、Readview和行锁原理分析直播中(1).zip事务原理MVCC、Readview和行锁原理分析直播中(1).zip事务原理MVCC、Readview和行锁原理分析直播中(1).zip事务...
mvcc-锈 在 Rust 中试验 MVCC
什么是MVCC MVCC即Multi-Version Concurrency Control,译为多版本并发控制。 MVCC的背景 MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制...
#H2数据库多版本并发控制(MVCC)测试 在 1.4.x 中默认激活 MVCC 模式在 1.4.x 版本中默认启用,使用默认的 MVStore 存储引擎。 MVCC 在使用 PageStore 存储引擎时默认是禁用的(这是 1.3.x 版中的默认设置)。 使用...