mvcc原理 MySQL MVCC原理

2021-10-13 02:39:23 字數 2220 閱讀 7449

1 mvcc基本原理

mvcc:多版本併發控制(mvcc,multiversion currency control)。一般情況下,事務性儲存引擎不是只使用表鎖,行加鎖的處理資料,而是結合了mvcc機制,以處理更多的併發問題。mvcc處理高併發能力最強,

但系統開銷 比最大(較表鎖、行級鎖),這是最求高併發付出的代價。

** innodb實現mvcc的方法是,它儲存了每一行的三個額外的隱藏字段:**

1.db_trx_id:乙個6byte的標識,每處理乙個事務,其值自動+1

#下面提到的「建立時間」和「刪除時間」記錄的就是這個db_trx_id的值

#如insert、update、delete操作時,刪除操作用1個bit表示。

#db_trx_id是最重要的乙個,可以通過語句「show engine innodb status」來查詢

2.db_roll_ptr: 大小是7byte,指向寫到rollback segment(回滾段)的一條undo log記錄

(update操作的話,記錄update前的row值)

3.db_row_id: 大小是6byte,該值隨新行插入單調增加。

#當由innodb自動產生聚集索引時聚集索引(即沒有主鍵時,因為mysql預設聚簇表,會自動生成乙個rowid)

#包括這個db_row_id的值,

#不然的話聚集索引中不包括這個值,這個用於索引當中。

db_trx_id記錄了行的建立的時間刪除的時間在每個事件發生的時候,每行儲存版本號,而不是儲存事件實際發生的時間。每次事物的開始這個版本號都會增加。自記錄時間開始,每個事物都會儲存記錄的系統版本號。

依照事物的版本來檢查每行的版本號。在insert操作時 「建立時間」=db_trx_id,這時,「刪除時間」是未定義的;在update時,複製新增行的「建立時間」=db_trx_id,刪除時間未定義,舊資料行「建立時間」不變,

刪除時間=該事務db_trx_id;delete操作,相應資料行的「建立時間」不變,刪除時間=該事務的db_row_id;select操作對兩者都不修改,唯讀相應的資料

mvcc結合隔離級別:

1.read uncommitted ,不適用mvcc讀,可以讀到其他事務修改甚至未提交的

2.read committed ,其他事務對資料庫的修改,只要已經提交,其修改的結果就是可見的,

與這兩個事務開始的先後順序無關,不完全適用於mvcc讀,

3.repeatable read,可重複讀,完全適用mvcc,只能讀取在它開始之前已經提交的事務對資料庫的修改,

在它開始以後,所有其他事務對資料庫的修改對它來說均不可見

4.serializable ,完全不適合適用mvcc,這樣所有的query都會加鎖,再它之後的事務都要等待

mvcc只工作在repeatable read和read commited隔離級別下

2 repeatable read 可重複讀下的mvcc

##### select

innodb檢查沒行資料,確保他們符合兩個標準:

1.innodb只查詢版本早於當前事務版本的資料行(也就是資料行的版本必須小於等於事務的版本),這確保當前事務

讀取的行都是事務之前已經存在的,或者是由當前事務建立或修改的行

2.行的刪除操作的版本一定是未定義的或者大於當前事務的版本號。確定了當前事務開始之前,行沒有被刪除

符合了以上兩點則返回查詢結果。

insert

innodb為每個新增行記錄當前系統版本號作為建立id。

delete

innodb為每個刪除行的記錄當前系統版本號作為行的刪除id。

update

innodb複製了一行。這個新行的版本號使用了系統版本號。它也把系統版本號作為了刪除行的版本。

3 mvcc深入

如果根據事務db_trx_id去比較獲取事務的話,按道理在乙個事務b(在事務a後,但a還沒commit)select的話 b.db_trx_id>a.db_trx_id則應該能返回a事務對資料的操作以及修改。那不是和前面矛盾?其實不然。

innodb每個事務在開始的時候,會將當前系統中的活躍事務列表(trx_sys->trx_list)建立乙個副本(read view),然後一致性讀去比較記錄的tx id的時候,並不是根據當前事務的tx id,而是根據read view最早乙個事務的tx id(read view->up_limit_id)來做比較的,這樣就能確保在事務b之前沒有提交的所有事務的變更,b事務都是看不到的。當然,這裡還有個小問題要處理一下,就是當前事務自身的變更還是需要看到的。

mvcc原理 MVCC 原理

mvcc 原理 簡單說,讀了一條未提交的資料 乙個事務讀取了另外乙個事務修改後記錄 強調的是 update 和delete 只需要鎖住滿足條件的記錄即可 乙個事務讀取了另外乙個事務插入的資料,強調的是 insert 要鎖住滿足條件及相近的記錄。mysql 中預設的隔離級別是可重複讀,可解決髒讀和不可...

mvcc原理 Innodb的MVCC原理

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

Mysql MVCC機制原理詳解

mvcc,全稱multi version concurrency control,即多版本併發控制。mvcc是一種併發控制的方法,一般在資料庫管理系統中,實現對資料庫的併發訪問,在程式語言中實現事務記憶體。我們知道,一般情況下我們使用mysql資料庫的時候使用的是innodb儲存引擎,innodb儲...