阿里云数字新基建系列:云数据库架构
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1.4 InnoDB的MVCC

MVCC是实现一致性读的必要条件,它是在并发访问数据库时,通过对数据的版本控制来实现事务内结果集的一致性的;它有别于锁,极大地提升了数据库的并发性能。

在MySQL中,MVCC支持两种事务隔离级别,即RR(可重复读)和RC(提交读)。在事务中执行SQL语句时,如果数据库设置的隔离级别为RR,则事务中每次select都会使用相同的快照,保证在事务内看到的结果集是一致的;如果设置的隔离级别为RC,则每次都会使用当前最新的快照,保证在事务内看到的是最新的提交记录。

我们先来了解一下MVCC的基本实现原理。MVCC通过对比数据库行事务ID与快照事务ID来判断数据的可见性,根据数据行上的回滚指针来寻找undo日志中的旧版本数据。这里假设事务隔离级别为RR,如图1-6所示。我们来了解它的基本实现逻辑。

图1-6 事务的MVCC实现

每个事务开始前都会申请一个ReadView结构,ReadView主要有low_limit_id、up_limit_id、trx_ids这几个比较重要的字段,它们分别是当前活跃事务中最大、最小的事务ID和数据行事务ID。接下来会通过数据行上的TRX_ID与low_limit_id、up_limit_id、trx_ids进行比较,判断当前事务是否对数据行可见,我们会根据可见性来执行不同的数据获取流程:对于可见的数据行,直接从行数据获取;对于不可见的数据行,需要通过数据行上的RollPtr回滚指针找到相应的回滚段,获取最近一次提交的版本来实现一致性读。