mvcc(多版本併發控制)
mvcc只能在可重複讀和讀已提交兩個隔離級別下工作,和其他隔離級別是不相容的,因為讀未提交總是讀取最新的資料,而可序列化對所有資料都會加鎖。
mvcc主要作用(解決了什麼問題):
早期資料庫不論讀取還是寫入,都用鎖來實現。但是鎖會帶來效能的問題,mvcc就是mysql對於讀的一種優化方案。
在使用mvcc中,對於任何修改的操作,都不會直接覆蓋掉原資料,而是產生乙個新老版本共存的狀態,根據版本號去區分,使得讀取時可以完全不加鎖,這樣讀取資料時,mvcc根據版本號就會判斷出應該讀取哪些資料,完全不用加鎖,mvcc存在的意義就是使mysql讀寫不衝突。
一句話概括:他就是乙個行級鎖的變種,讀資料無需加鎖、讀寫不衝突,系統開銷更低。
innodb的mvcc是通過在每行記錄後面儲存兩個隱藏的列來實現。
在插入資料的時候,刪除的事務id是空的
在執行刪除操作時,mysql會在底層記錄刪除行的刪除事務id,對於更新操作原資料並不會真正的被更新掉,只是會隱藏,然後再新增一條資料(暫時可以這麼理解,其實底層是使用undo log完成的),mysql會在底層新增一行相同的資料,並記錄好對應的建立事務id。
當然儲存的並不是真實的時間而是系統版本號。每開始乙個新的事務,系統版本號都會自動新增。事務開始時刻的系統版本號會作為事務的版本號,用來查詢到每行記錄的版本號進行比較。
mvcc在可重複讀隔離級別下mysql是如何工作的:
開始新乙個事務時,該事務的版本號肯定會大於當前所有資料行快照的建立版本號
select操作:
innodb只查詢版本早於當前事務版本的資料行,這樣就可以確保查詢到的資料在此事務操作之前就已經存在了,要麼是事務自身插入或者修改過的,會過濾掉此事務開始之後的資料。
行的刪除版本號要麼未定義,要麼大於當前事務id,確保事務讀取到的行在事務開始前未被刪除(如果事務開始之前被刪除的話,刪除事務id就會小於當前建立事務id,這些資料會被過濾掉),但在事務開始之後刪除的資料同樣也會被查詢到。
簡化一下就是這樣子:
事務id <= 當前操作事務id && (刪除id > 當前事務id || 刪除id == null)
只有符合上面兩個條件的資料才會被查詢出來。
install操作:
增加建立版本號。
delete操作:
增加刪除版本號。
update操作:
增加建立版本號。
快照讀與當前讀:
通過mvcc機制,雖然讓資料變得可重複讀,但我們讀到的資料可能是歷史資料,不是資料庫最新的資料。這種讀取歷史資料的方式,我們叫它快照讀,而讀取資料庫最新版本資料的方式,叫當前讀。
對於select操作會採用快照讀。
對於(install、update、delete)操作會採用當前讀。
MySQL中的鎖及MVCC機制
innodb 使用行級鎖 myisam 使用表級鎖 mvcc的實現,通過儲存資料在某個時間點的快照來實現的。這意味著乙個事務無論執行多長時間,在同乙個事務裡能夠 看到資料一致的檢視。根據事務開始的時間不同,同時也意味著在同乙個時刻不同事務看到的相同表裡的資料可能是不同的。innodb的mvcc實現,...
MySQL(十四) 事務 MVCC機制
事務的四大特性 atomicity 原子性 isolation 隔離性 consistency 一致性 和durability 永續性 重點說下隔離性,指的是多個事務並行執行時,效果上就像乙個乙個執行的。沒有因為是並行而導致問題。因為系統不可能完全讓事務順序執行,這樣效能太差,所以說需要在併發的同時...
MySQL 多版本控制 MVCC 機制初探
總結搞定mysql 帶你搞定mysql實戰,輕鬆對應海量業務處理及高併發需求,從容應對大場面試 mysql innodb 儲存引擎,實現的是基於多版本的併發控制協議 mvcc,而不是基於鎖的併發控制。mvcc 最大的好處是讀不加鎖,讀寫不衝突。在讀多寫少的 oltp on line transact...