InnoDB的多版本併發控制(MVCC)

2021-08-18 19:50:07 字數 843 閱讀 6229

前言

這篇文章介紹mysql裡面innodb引擎事務的多版本併發控制機制(mvcc),可以用來實現兩種事務的隔離級別:read committed和repeatable read(關於事務隔離級別的介紹,可以參考這篇文章:同時mvcc解決了repeatable read中可能出現的幻讀的問題。

實現mvcc的核心就是給每行資料增加了兩個隱藏的列,乙個是修改這行的最後的系統版本號(system version number),乙個是刪除該行的系統版本號。每開始乙個新事物,系統版本號就會遞增。事務開始的時候,系統版本號會作為當前事務的版本號,用來查詢和操作。

select:

a. innodb只會讀取版本號小於等於該事務版本號的所有資料行,這樣保證了事務進行時,所有的行要麼是事務進行前已經存在,要麼是事務自身插入或者修改的(這樣實現了事務重複讀取資料一致,同時不會出現幻讀的現象)

b. 同時讀取的行的刪除版本號要麼是未設定的,要麼大於當前事務版本號,這樣保證該行在事務開始前沒有被刪除。

insert:

innodb為新插入的每一行儲存當前的系統版本號作為行版本號。

delete:

innodb為刪除的每一行儲存當前系統版本號作為刪除版本號。

update:

innodb將更新資料插入新一行,將事務版本號作為新一行的行版本號,同時將老一行的刪除版本號置為當前事務版本號。

優缺點優點:1. 在事務中,大多數的讀操作不需要加鎖     2. 解決了repeatable read中幻讀的問題

一點感想

資料版本號在我們日常工作中很多地方都可以發揮作用:例如實現冪等、簡單的樂觀鎖機制等等。希望之後能夠多學習多實踐,有朝一日能夠比較完善地總結一下資料版本號的各種用途。

多版本併發控制

多版本併發控制,討論的不是指的乙個軟體同時發行多個版本怎麼進行管理的問題,而是mysql中的mvcc。mvcc,multiple version concurrent control,多版本併發控制。可以認為mvcc是行級鎖的乙個變種,但它在很多情況下避免了加鎖操作,因此開銷更低。雖然實現機制有所不...

多版本併發控制(MVCC)

mysql的大多數事務性儲存引擎 如innodb 實現的都不是簡單的行級鎖。基於提公升併發效能的考慮,它們一般都同時實現了多版本併發控制 mvcc 可以認為mvcc是行級鎖的乙個變種,但是它在很多情況下避免了加鎖操作,因此開銷更低。雖然實現機制有所不同,但大都實現了非阻塞的讀操作,寫操作也只鎖定必要...

1 4 多版本併發控制

1.4.多版本併發控制 大多數的mysql事務型儲存引擎,如innodb,falcon以及pbxt都不使用一種簡單的行鎖機制。事實上,他們都和和另外一種用來增加併發性的被稱為 多版本併發控制 mvcc 的機制來一直使用。mvcc不只使用在mysql中,oracle,postgresql以及其他一些資...