多版本併發控制數據庫
Multiversion Concurrency Control併發
大部分的MySQL的存儲 引擎,好比InnoDB,Falcon,以及PBXT並非簡簡單單的使用行鎖機制。它們都使用了行鎖結合一種提升併發的技術,被稱爲MVCC(多版本併發控制)。MVCC並不僅僅應用在MySQL中,其餘的數據庫如Oracle,PostgreSQL,以及其餘數據庫也使用這個技術。高併發
MVCC避免了許多須要加鎖的情形以及下降消耗。這取決於它實現的方式,它容許非阻塞讀取,在寫的操做的時候阻塞必要的記錄。spa
MVCC保存了某一時刻數據的一個快照。意思就是不管事物運行了多久,它們都能看到一致的數據。也就是說在相同的時間下,不一樣的事物看相同表的數據是不一樣的。若是你歷來沒有這方面的經驗,可能說這些有點使人困惑。可是在之後這個會很容易理解和熟悉的。事件
每一個存儲引擎實現MVCC方式都是不一樣的。有許多種包含了樂觀(optimistic)和悲觀(pessimistic)的併發控制。咱們用簡單的InnoDb的行爲來舉例說明MVCC工做方式。io
InnoDB實現MVCC的方法是,它存儲了每一行的兩個額外的隱藏字段,這兩個隱藏字段分別記錄了行的建立的時間和刪除的時間。在每一個事件發生的時 候,每行存儲版本號,而不是存儲事件實際發生的時間。每次事物的開始這個版本號都會增長。自記錄時間開始,每一個事物都會保存記錄的系統版本號。依照事物的 版原本檢查每行的版本號。在事物隔離級別爲可重複讀的狀況下,來看看怎樣應用它。table
SELECT序列化
InnoDB檢查每行,要肯定它符合兩個標準。方法
InnoDB必須知道行的版本號,這個行的版本號至少要和事物版本號同樣的老。(也就是是說它的版本號可能少於或者和事物版本號相同)。這個既能肯定事物開始以前行是存在的,也能肯定事物建立或修改了這行。im
行的刪除操做的版本必定是未定義的或者大於事物的版本號。肯定了事物開始以前,行沒有被刪除。
符合了以上兩點。會返回查詢結果。
INSERT
InnoDB記錄了當前新增行的系統版本號。
DELETE
InnoDB記錄的刪除行的系統版本號做爲行的刪除ID。
UPDATE
InnoDB複製了一行。這個新行的版本號使用了系統版本號。它也把系統版本號做爲了刪除行的版本。
全部其餘記錄的結果保存是,從未得到鎖的查詢。這樣它們查詢的數據就會盡量的快。要肯定查詢行要遵循這些標準。缺點是存儲引擎要爲每一行存儲更多的數據,檢查行的時候要作更多的處理以及其餘內部的一些操做。
MVCC只能在可重複讀和可提交讀的隔離級別下生效。不可提交讀不能使用它的緣由是不能讀取符合事物版本的行版本。它們老是讀取最新的行版本。可序列化不能使用MVCC的緣由是,它老是要鎖定行。
下面的表說明了在MySQL中不一樣鎖的模式以及併發級別。
鎖的策略 | 併發性 | 開銷 | 引擎 |
表 | 最低 | 最低 | MyISAM,Merge,Memory |
行 | 高 | 高 | NDB Cluster |
行和MVCC | 最高 | 最高 | InnoDB,Falcon,PBXT,solidD |