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

修改操作

讀取操作

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