innodb使用mvcc實現高併發
mvcc並不是mysql獨有的,oracle,postgresql等都實現了mvcc,但各自實現機制不同。因為mvcc沒有統一實現標準。
mvcc可以認為它是行級鎖的乙個變種,但是它在很多情況下避免了加鎖操作,因此開銷更低。實現了非阻塞的讀操作,寫操作也只鎖定必要的行。
mvcc的實現,通過儲存資料在某個時間點的快照來實現的。這意味著乙個事務無論執行多長時間,在同乙個事務裡看到資料都實一致的。根據事務開始的時間不同,每個事務對同一張表同乙個時刻看到的資料可能不同。
每行資料都存在乙個版本,每次資料更新時都更新該版本。
修改時copy出當前版本隨意修改,各個事務之間無干擾。
儲存時比較版本號,如果成功(commit),則覆蓋原記錄;失敗則放棄copy(rollback)
innodb儲存引擎mvcc的實現的實現策略
通過在每一行資料後面儲存兩個隱藏的列實現:當前行建立時的版本號和刪除時的版本號(可能為空)。這裡的版本號並不是實際的時間值,而是系統版本號。每開始乙個新的事務,系統版本號都會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比較。
每個事務又有自己的版本號,這樣事務內執行crud操作時,就通過版本號的比較來達到資料版本控制的目的。具體做法見下面的示意圖。
select:innodb會根據以下兩個條件檢查每行記錄:
insert:innodb為新插入的每一行儲存當前系統版本號作為行版本號。
delete:innodb為刪除的每一行儲存當前系統版本號作為行刪除標識。
update:innodb為插入一行新記錄,儲存當前系統版本號作為行版本號,同時儲存當系統的版本號為原來的行作為刪除標識。
儲存這兩個額外系統版本號,使大多數操作都可以不用加鎖。這樣設計使得計資料操作很簡單,效能很好,並且也能保證只會讀取到符合標準的行。不足之處是每行記錄都需要額外的儲存空間,需要做更多的行檢查工作,以及一些額外的維護工作。
mvcc只在repeatable read和read commited兩個隔離級別下工作,其它兩個隔離級別和mvcc不相容。
purge功能:
innodb由於要支援多版本協議,因此無論是更新,刪除,都只是設定記錄上的deleted bit標記位,而不是真正的刪除記錄。後續這些記錄的真正刪除,是通過purge後台程序實現的。purge程序定期掃瞄innodb的undo,按照先讀老undo,再讀新undo的順序,讀取每條undo record。對於每一條undo record,判斷其對應的記錄是否可以被purge
mvcc 可以保證不阻塞地讀到一致的資料
參考:
mysql MVCC 多版本併發控制
mvcc是行級鎖的乙個變種,但是它在很多情況下避免了加鎖操作,因此開銷更低。大多數的mvcc都實現了非阻塞的讀操作,寫操作也只鎖定必要的行。主要是避免讀寫場景下加鎖控制的效能開銷。multiversion concurrency control 多版本併發控制 併發訪問 讀或者寫 資料庫時,對正在事...
mysql mvcc多版本併發控制
事務隔離的實現方案有兩種,lbcc和mvcc 基於鎖的併發控制,英文全稱lock based concurrent control。這種方案比較簡單粗暴,就是乙個事務去讀取一條資料的時候,就上鎖,不允許其他事務來操作 當然這個鎖的實現也比較重要,如果我們只鎖定當前一條資料依然無法解決幻讀問題 這個概...
Mysql MVCC多版本併發控制原理詳解
我們建立乙個hero表 create table hero number int,name varchar 100 country varchar 100 primary key number engine innodb charset utf8 然後向這個表裡插入一條資料 insert into ...