WiredTiger中并发控制(MVCC)

在支持行级并发或者文档级并发的数据库中,为了进一步提升系统的并发性,通常都会使用MVCC的机制。
MVCC是一种非锁机制进行读操作来提升性能, 我们知道锁是一种有限的系统资源, 锁定和解锁都是需要一定的时间的, 并且如果请求的锁无法得到的时候, 还需要等待。 如果采用的是互斥锁, 当该锁可用的时候, 系统需要通过发送信号来在线程间通信; 另外一种方式是通过自旋锁的方式, 一直去询问所需的资源是否准备好, 很浪费CPU资源。
MVCC可以提供基于某个时间点(POV, point-of-view)的快照(snapshot),使得对于事务看来,总是可以提供与事务开始时刻相一致的数据,而不管这个事务执行的时间有多长。所以在不同的事务看来,同一时刻看到的相同行的数据可能是不一样的,即一个行可能有多个版本。

在WiredTiger里面, 事务的一致性主要是通过timestamp,每一个timestamp对应一个相应的snapshot,对于每一个事务操作在事务开始的时候, 得到事务的timestamp, 在存储引擎里面会有一个snapshot与之对应。该snapshot记录了该事务在运行过程中的状态, 并且记录了事务还没有提交的事务的[min_snap_id, max_snap_id], 它是从创建snapshot的时候从global_snapshot里面copy出来的, 记录了在创建的时候, 还没有commit的事务列表。在min_snap_id之前的事务是已经提交的事务, 对应的数据是可以读的, 大于min_snap_id且小于等于max_snap_id是正在运行事务。

插入修改

在InsertCmd里面, 会生成一个OperationContext, 并且调用insertDocuments,通过WriteUnitOfWork对象来构造一个事务, 来完成整个过程:

写入数据
 通过函数WiredTigerRecordStore::insertRecords, 将指定的文档写入到指定的集合里面。
写如索引
通过函数IndexCatalogImpl::_indexRecords, 修改索引相关的文档;
写oplog

OpObserverImpl::onInserts;

事务提交

WiredTigerRecoveryUnit::onCommit

修改操作

读取操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章