MYSQL MVCC实现及其机制
多版本并發(fā)控制
Multiversion Concurrency Control
大部分的MySQL的存儲(chǔ) 引擎,比如InnoDB,Falcon,以及PBXT并不是簡簡單單的使用行鎖機(jī)制。它們都使用了行鎖結(jié)合一種提高并發(fā)的技術(shù),被稱為MVCC(多版本并 發(fā)控制)。MVCC并不單單應(yīng)用在MySQL中,其他的數(shù)據(jù)庫如Oracle,PostgreSQL,以及其他數(shù)據(jù)庫也使用這個(gè)技術(shù)。
MVCC避免了許多需要加鎖的情形以及降低消耗。這取決于它實(shí)現(xiàn)的方式,它允許非阻塞讀取,在寫的操作的時(shí)候阻塞必要的記錄。
MVCC保存了某一時(shí)刻數(shù)據(jù)的一個(gè)快照。意思就是無論事物運(yùn)行了多久,它們都能看到一致的數(shù)據(jù)。也就是說在相同的時(shí)間下,不同的事物看相同表的數(shù)據(jù)是不同的。如果你從來沒有這方面的經(jīng)驗(yàn),可能說這些有點(diǎn)令人困惑。但是在以后這個(gè)會(huì)很容易理解和熟悉的。
每個(gè)存儲(chǔ)引擎實(shí)現(xiàn)MVCC方式都是不同的。有許多種包含了樂觀(optimistic)和悲觀(pessimistic)的并發(fā)控制。我們用簡單的InnoDb的行為來舉例說明MVCC工作方式。
InnoDB實(shí)現(xiàn)MVCC的方法是,它存儲(chǔ)了每一行的兩個(gè)額外的隱藏字段,這兩個(gè)隱藏字段分別記錄了行的創(chuàng)建的時(shí)間和刪除的時(shí)間。在每個(gè)事件發(fā)生的時(shí) 候,每行存儲(chǔ)版本號(hào),而不是存儲(chǔ)事件實(shí)際發(fā)生的時(shí)間。每次事物的開始這個(gè)版本號(hào)都會(huì)增加。自記錄時(shí)間開始,每個(gè)事物都會(huì)保存記錄的系統(tǒng)版本號(hào)。依照事物的 版本來檢查每行的版本號(hào)。在事物隔離級(jí)別為可重復(fù)讀的情況下,來看看怎樣應(yīng)用它。
SELECT
InnoDB檢查每行,要確定它符合兩個(gè)標(biāo)準(zhǔn)。
InnoDB必須知道行的版本號(hào),這個(gè)行的版本號(hào)至少要和事物版本號(hào)一樣的老。(也就是是說它的版本號(hào)可能少于或者和事物版本號(hào)相同)。這個(gè)既能確定事物開始之前行是存在的,也能確定事物創(chuàng)建或修改了這行。
行的刪除操作的版本一定是未定義的或者大于事物的版本號(hào)。確定了事物開始之前,行沒有被刪除。
符合了以上兩點(diǎn)。會(huì)返回查詢結(jié)果。
INSERT
InnoDB記錄了當(dāng)前新增行的系統(tǒng)版本號(hào)。
DELETE
InnoDB記錄的刪除行的系統(tǒng)版本號(hào)作為行的刪除ID。
UPDATE
InnoDB復(fù)制了一行。這個(gè)新行的版本號(hào)使用了系統(tǒng)版本號(hào)。它也把系統(tǒng)版本號(hào)作為了刪除行的版本。
所有其他記錄的結(jié)果保存是,從未獲得鎖的查詢。這樣它們查詢的數(shù)據(jù)就會(huì)盡可能的快。要確定查詢行要遵循這些標(biāo)準(zhǔn)。缺點(diǎn)是存儲(chǔ)引擎要為每一行存儲(chǔ)更多的數(shù)據(jù),檢查行的時(shí)候要做更多的處理以及其他內(nèi)部的一些操作。
MVCC只能在可重復(fù)讀和可提交讀的隔離級(jí)別下生效。不可提交讀不能使用它的原因是不能讀取符合事物版本的行版本。它們總是讀取最新的行版本。可序列化不能使用MVCC的原因是,它總是要鎖定行。
下面的表說明了在MySQL中不同鎖的模式以及并發(fā)級(jí)別。
| 鎖的策略 | 并發(fā)性 | 開銷 | 引擎 |
| 表 | 最低 | 最低 | MyISAM,Merge,Memory |
| 行 | 高 | 高 | NDB Cluster |
| 行和MVCC | 最高 | 最高 | InnoDB,Falcon,PBXT,solidD |
?
總結(jié)
以上是生活随笔為你收集整理的MYSQL MVCC实现及其机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贪吃蛇 WPF
- 下一篇: linux cmake编译源码,linu