多版本併發控制,討論的不是指的乙個軟體同時發行多個版本怎麼進行管理的問題,而是mysql中的mvcc。
mvcc,multiple version concurrent control,多版本併發控制。
可以認為mvcc是行級鎖的乙個變種,但它在很多情況下避免了加鎖操作,因此開銷更低。雖然實現機制有所不同,但大都實現了非阻塞的讀操作,寫操作也只鎖定必要的行。
mvcc的實現,是通過儲存資料在某個時間點的快照來實現的。也就是說,不管需要執行多長時間,每個事務看到的資料都是一致的。根據事務開始時間的不同,每個事務對同一張表,同一時刻看到的資料可能是不一樣的。
前面說到了不同儲存引擎的mvcc的實現是不同的,典型的有樂觀併發控制和悲觀併發控制。下面我們通過簡化版行為來說明mvcc是如何工作的。
innodb的mvcc,是通過在每行後面儲存兩個隱藏的列來實現的。這兩個列,乙個儲存了行的的建立時間,乙個儲存了行的過期時間(或刪除時間)。當然,儲存的並不是實際的時間,而是系統版本號。每開始乙個新的事務,系統版本號會自動遞增。事務開始時刻的系統版本號作為該事務的版本號,用來和查詢到的行的版本號進行比較。
下面看一下在可重複讀隔離級別下,mcvv的具體實現過程。
1,select
innodb會根據兩個條件來檢查每行記錄。
a,innodb只查詢版本早於當前事務版本號的行(也就是說,行的系統版本號,小於或等於當前事務的系統版本號),這樣可以保證事務讀取的行,要麼是在事務開始之前已經存在的,要麼是事務自身或者修改過的。
b,行的刪除版本號要麼未定義,要麼大於當前事務版本號。這樣可以保證,事務讀取到的行,在事務開始之前未刪除。
只有符合以上兩個條件的資料,才會返回。
2,insert
innodb為插入的每一行資料儲存當前的系統版本號作為行版本號。
3,delete
innodb為刪除的每一行儲存當前的系統版本號作為行的刪除標誌。
4,update
innodb插入一行新的資料,並儲存當前的系統版本號作為新插入行的版本號,並且儲存當前系統版本號到原來的行作為它的刪除標誌。
儲存兩個額外的系統版本號,使得大多數讀操作都不用加鎖。
mvcc只在可重複讀和讀已提交兩個隔離級別下工作。其他兩個隔離級別都與mvcc不相容,因為讀未提交總是讀取最新的資料行,而不是符合當前事務版本的資料行。而序列化則會對所有讀取的行進行加鎖。
多版本併發控制(MVCC)
mysql的大多數事務性儲存引擎 如innodb 實現的都不是簡單的行級鎖。基於提公升併發效能的考慮,它們一般都同時實現了多版本併發控制 mvcc 可以認為mvcc是行級鎖的乙個變種,但是它在很多情況下避免了加鎖操作,因此開銷更低。雖然實現機制有所不同,但大都實現了非阻塞的讀操作,寫操作也只鎖定必要...
1 4 多版本併發控制
1.4.多版本併發控制 大多數的mysql事務型儲存引擎,如innodb,falcon以及pbxt都不使用一種簡單的行鎖機制。事實上,他們都和和另外一種用來增加併發性的被稱為 多版本併發控制 mvcc 的機制來一直使用。mvcc不只使用在mysql中,oracle,postgresql以及其他一些資...
多版本併發控制MVCC
大多數mysql的事務性儲存引擎,例如innodb.falcon 和pbxt,不是簡單地使用行加鎖的機制,而是選用一種叫做 多版本併發控制 mvcc,mutiversion concurrency control 的技術,和行加鎖機制關聯使用,以應對更多的併發處理問題。mvcc不是mysql獨有的技...