我理解的MVCC內部實現原理

2021-08-18 00:16:44 字數 2518 閱讀 5046

mysql innodb儲存引擎,實現的是基於多版本的併發控制協議——mvcc (multi-version concurrency control) (注:與mvcc相對的,是基於鎖的併發控制,lock-based concurrency control)。mvcc最大的好處,相信也是耳熟能詳:讀不加鎖,讀寫不衝突。在讀多寫少的oltp應用中,讀寫不衝突是非常重要的,極大的增加了系統的併發效能,這也是為什麼現階段,幾乎所有的rdbms,都支援了mvcc。

對於delete操作,innodb是通過先將要刪除的那一行標記為刪除,而不是馬上清除這一行,因為innodb實現了mvcc,這些undo段用來實現mvcc多版本機制。鎖不阻塞讀,讀也不阻塞寫,這樣大大提高了併發性。那麼在一致性讀的時候,怎麼才能找到和事務開始的那個版本呢?

1

2

   主鍵索引,每個行都有乙個事務id和乙個undo id,這個undo id指向了這行的先前版本的位置。

   非主鍵索引(輔助索引secondary index),通過先找主鍵索引再找到undo段。而對於update操作,則是先標記刪除,然後insert乙個新的行,接下來如果有一致性讀,那麼查詢old version的行的原理和delete操作是一樣的

innodb的行記錄格式中有6位元組事務id的和7位元組的回滾指標,通過為每一行記錄新增這兩個額外的隱藏值來實現mvcc,這兩個值乙個記錄這行資料何時被建立,另外乙個記錄這行資料何時過期(或者被刪除)。但是innodb並不儲存這些事件發生時的實際時間,相反它只儲存這些事件發生時的系統版本號。這是乙個隨著事務的建立而不斷增長的數字。每個事務在事務開始時會記錄它自己的系統版本號。每個查詢必須去檢查每行資料的版本號與事務的版本號是否相同。讓我們來看看當隔離級別是repeatable read時這種策略是如何應用到特定的操作的。

1

2

3

4

5

6

7

8

9

10

* select:

當隔離級別是repeatable read時select操作,innodb必須每行資料來保證它符合兩個條件:

1、innodb必須找到乙個行的版本,它至少要和事務的版本一樣老(也即它的版本號不大於事務的版本號)。這保證了不管是事務開始之前,或者事務建立時,或者修改了這行資料的時候,這行資料是存在的。

2、這行資料的刪除版本必須是未定義的或者比事務版本要大。這可以保證在事務開始之前這行資料沒有被刪除。

符合這兩個條件的行可能會被當作查詢結果而返回。

* insert:

innodb為這個新行記錄當前的系統版本號。

* delete:

innodb將當前的系統版本號設定為這一行的刪除id。

* update:

innodb會寫乙個這行資料的新拷貝,這個拷貝的版本為當前的系統版本號。它同時也會將這個版本號寫到舊行的刪除版本裡。

這種額外的記錄所帶來的結果就是對於大多數查詢來說根本就不需要獲得乙個鎖。他們只是簡單地以最快的速度來讀取資料,確保只選擇符合條件的行。這個方案的缺點在於儲存引擎必須為每一行儲存更多的資料,

做更多的檢查工作,處理更多的善後操作。

mvcc只工作在repeatable read和read commited隔離級別下。read uncommited不是mvcc相容的,因為查詢不能找到適合他們事務版本的行版本;它們每次都只能讀到最新的版本。

seriablable也不與mvcc相容,因為讀操作會鎖定他們返回的每一行資料。

併發控制技術:

12

3

4

5

lbcc:lock-based concurrency control,基於鎖的併發控制。

mvcc:multi-version concurrency control,基於多版本的併發控制協議。純粹基於鎖的併發機制併發量低,mvcc是在基於鎖的併發控制上的改進,主要是在讀操作上提高了併發量。

在mvcc併發控制中,讀操作可以分成兩類:

1)快照讀 (snapshot read):讀取的是記錄的可見版本 (有可能是歷史版本),不用加鎖(共享讀鎖s鎖也不加,所以不會阻塞其他事務的寫)。

2)當前讀 (current read):讀取的是記錄的最新版本,並且,當前讀返回的記錄,都會加上鎖,保證其他事務不會再併發修改這條記錄。

分類: 

mysql

mvcc原理 Innodb的MVCC原理

該文章是 innodb的mvcc簡介 中的細節作出解釋。在mvcc出現之前的資料庫,為了實現一致性讀,如sqlserver,db2均採用鎖定讀技術,寫操作往往會阻塞讀操作,導致資料庫併發效能不高。oracle與postgre相繼推出自己的多版本併發控制技術,這一技術的核心是在發生讀寫衝突時候,讀操作...

MySQL Innodb的MVCC實現原理

mvcc是multi version concurrency control的縮寫,也就是多版本併發控制。大家都知道,事務的隔離可以通過行鎖來實現。在開啟事務時,對操作記錄加行鎖,事務結束時釋放鎖。但是這樣加鎖會降低事務的併發量,並且對執行緒的阻塞和恢復操作也會損耗效能。那種在事務中使用了selec...

Mysql 的 MVCC 實現原理

mysql 中mvcc 實現原理,可翻看原始碼檢視 1個6byte的 db trx id標識 該行insert或者update操作的最新事務id,刪除操作也被當作乙個update操 作 用1個bit表示刪除 1個7byte的db roll ptr,指向寫到rollback segment的一條und...