前言
以下的分析均在mysql的InnoDB引擎下。假设此时事务A与事务B同时执行。
一、定义:
MVCC(Multi-Version Concurrency Control,多版本并发控制)一种并发控制机制,在数据库中用来控制并发执行的事务,控制事务隔离进行。
二、核心思想:
MVCC是通过保存数据在某个时间点的快照来进行控制的。使用MVCC就是允许同一个数据记录拥有多个不同的版本。然后在查询时通过添加相对应的约束条件,就可以获取用户想要的对应版本的数据。
三、基本数据结构
1、redo log:
重做日志记录。存储事务操作的最新数据记录,方便日后使用。
2、undo log
撤回日志记录,也称版本链。当前事务未提交之前,undo log保存了当前事务的正在操作的数据记录的所有版本的信息,undo log中的数据可作为数据旧版本快照供其他并发事务进行快照读。每次有其它事务提交对当前数据行的修改,都是添加到undo log中。undo log是由每个数据行的多个不同的版本链接在一起构成的一个记录“链表”。如下图:
3、read_view(快照)
①read_view的简单理解:
会对数据在每个时刻的状态拍成照片记录下来。那么之后获取某时刻的数据时就还是原来的照片上的数据,是不会变的。其实也可以简单理解为是一个版本链的集合,只不过在这里的版本链是经过筛选的。
②read_view的基本结构:
read_view->creator_trx_id = 当前事务id; # 当前的事务id
read_view->up_limit_id = 12654; # 当前活跃事务的最小id
read_view->low_limit_id = 12659; # 当前活跃事务的最小id
read_view->trx_ids = [12654, 12659]; # 当前活跃的事务的id列表,又称活跃事务链表。表示在记录当前快照时的所有活跃的、未提交的事务
read_view->m_trx_ids = 2; # 当前活跃的事务id列表长度
注意:
read_view中包含了活跃事务链表,这个链表表示此时还在活跃的事务,指的是那些在当前快照中还未提交的事务。(注意:新建事务(当前事务)与正在内存中commit 的事务不在活跃事务链表)。
read_view中不会显示所有的数据行,只会显示“可见”的记录。筛选方式如下所述。
③read_view的记录筛选方式:
前提:DATA_TRX_ID 表示每个数据行的最新的事务ID;up_limit_id表示当前快照中的最先开始的事务