大部分的mysql的儲存引擎,比如innodb,falcon,以及pbxt並不是簡簡單單的使用行鎖機制。它們都使用了行鎖結合一種提高併發的技術,被稱為mvcc(多版本併發控制)。mvcc並不單單應用在mysql中,其他的資料庫如oracle,postgresql,以及其他資料庫也使用這個技術。
mvcc避免了許多需要加鎖的情形以及降低消耗。這取決於它實現的方式,它允許非阻塞讀取,在寫的操作的時候阻塞必要的記錄。
mvcc儲存了某一時刻資料的乙個快照。意思就是無論事物執行了多久,它們都能看到一致的資料。也就是說在相同的時間下,不同的事物看相同表的資料是不同的。如果你從來沒有這方面的經驗,可能說這些有點令人困惑。但是在以後這個會很容易理解和熟悉的。
每個儲存引擎實現mvcc方式都是不同的。有許多種包含了樂觀(optimistic)和悲觀(pessimistic)的併發控制。我們用簡單的innodb的行為來舉例說明mvcc工作方式。
innodb實現mvcc的方法是,它儲存了每一行的兩個額外的隱藏字段,這兩個隱藏字段分別記錄了行的建立的時間和刪除的時間。在每個事件發生的時候,每行儲存版本號,而不是儲存事件實際發生的時間。每次事物的開始這個版本號都會增加。自記錄時間開始,每個事物都會儲存記錄的系統版本號。依照事物的版本來檢查每行的版本號。在事物隔離級別為可重複讀的情況下,來看看怎樣應用它。
select
innodb檢查每行,要確定它符合兩個標準。
符合了以上兩點。會返回查詢結果。
insert
innodb記錄了當前新增行的系統版本號。
delete
innodb記錄的刪除行的系統版本號作為行的刪除id。
update
innodb複製了一行。這個新行的版本號使用了系統版本號。它也把系統版本號作為了刪除行的版本。
所有其他記錄的結果儲存是,從未獲得鎖的查詢。這樣它們查詢的資料就會盡可能的快。要確定查詢行要遵循這些標準。缺點是儲存引擎要為每一行儲存更多的資料,檢查行的時候要做更多的處理以及其他內部的一些操作。
mvcc只能在可重複讀和可提交讀的隔離級別下生效。不可提交讀不能使用它的原因是不能讀取符合事物版本的行版本。它們總是讀取最新的行版本。可序列化不能使用mvcc的原因是,它總是要鎖定行。
下面的表說明了在mysql中不同鎖的模式以及併發級別。
鎖的策略
併發性
開銷 引擎表
最低最低
myisam,merge,memory行高
高ndb cluster
行和mvcc
最高最高
innodb,falcon,pbxt,soliddb
MySQL 架構 MVCC多版本併發控制
我們知道,mysql的innodb採用的是行鎖,而且採用了多版本併發控制來提高讀操作的效能。什麼是多版本併發控制呢 其實就是在每一行記錄的後面增加兩個隱藏列,記錄建立版本號和刪除版本號,而每乙個事務在啟動的時候,都有乙個唯一的遞增的版本號。1 在插入操作時 記錄的建立版本號就是事務版本號。比如我插入...
Mysql多版本併發控制
mysql的絕大多數事務型儲存引擎都不是簡單的行級鎖。他們實現了多版本的併發控制,也就是mvvc,當然,支援mvvc的資料庫並不只有mysql,orcale postgresql等都實現了mvvc,只不過他們實現的方式不同而已,因為mvvc沒有乙個統一的規範。其實mvvc可以理解為行級鎖的一種變異,...
mysql多版本併發控制MVCC
innodb的mvcc是通過在每行記錄的後面儲存兩個隱藏的列來實現的,這兩個列乙個儲存行的建立時間,乙個儲存行的過期時間。但是並不是儲存時間而是儲存版本號,每開始乙個新的事務,版本號會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到每行記錄的版本號進行比較。select innod...