MYSQL MVCC實現及其機制

來源:互聯網
上載者:User

標籤:

多版本並發控制

  Multiversion Concurrency Control

  大部分的MySQL的儲存 引擎,比如InnoDB,Falcon,以及PBXT並不是簡簡單單的使用行鎖機制。它們都使用了行鎖結合一種提高並發的技術,被稱為MVCC(多版本並 發控制)。MVCC並不單單應用在MySQL中,其他的資料庫如Oracle,PostgreSQL,以及其他資料庫也使用這個技術。

  MVCC避免了許多需要加鎖的情形以及降低消耗。這取決於它實現的方式,它允許非阻塞讀取,在寫的操作的時候阻塞必要的記錄。

  MVCC儲存了某一時刻資料的一個快照。意思就是無論事物運行了多久,它們都能看到一致的資料。也就是說在相同的時間下,不同的事物看相同表的資料是不同的。如果你從來沒有這方面的經驗,可能說這些有點令人困惑。但是在以後這個會很容易理解和熟悉的。

  每個儲存引擎實現MVCC方式都是不同的。有許多種包含了樂觀(optimistic)和悲觀(pessimistic)的並發控制。我們用簡單的InnoDb的行為來舉例說明MVCC工作方式。

   InnoDB實現MVCC的方法是,它儲存了每一行的兩個額外的隱藏欄位,這兩個隱藏欄位分別記錄了行的建立的時間和刪除的時間。在每個事件發生的時 候,每行儲存版本號碼,而不是儲存事件實際發生的時間。每次事物的開始這個版本號碼都會增加。自記錄時間開始,每個事物都會儲存記錄的系統版本號碼。依照事物的 版本來檢查每行的版本號碼。在事物隔離等級為可重複讀的情況下,來看看怎樣應用它。

  SELECT

  InnoDB檢查每行,要確定它符合兩個標準。

  InnoDB必須知道行的版本號碼,這個行的版本號碼至少要和事物版本號碼一樣的老。(也就是是說它的版本號碼可能少於或者和事物版本號碼相同)。這個既能確定事物開始之前行是存在的,也能確定事物建立或修改了這行。

  行的刪除操作的版本一定是未定義的或者大於事物的版本號碼。確定了事物開始之前,行沒有被刪除。

  符合了以上兩點。會返回查詢結果。

  INSERT

  InnoDB記錄了當前新增行的系統版本號碼。

  DELETE

  InnoDB記錄的刪除行的系統版本號碼作為行的刪除ID。

  UPDATE

  InnoDB複製了一行。這個新行的版本號碼使用了系統版本號碼。它也把系統版本號碼作為了刪除行的版本。

  所有其他記錄的結果儲存是,從未獲得鎖的查詢。這樣它們查詢的資料就會儘可能的快。要確定查詢行要遵循這些標準。缺點是儲存引擎要為每一行儲存更多的資料,檢查行的時候要做更多的處理以及其他內部的一些操作。

  MVCC只能在可重複讀和可提交讀的隔離等級下生效。不可提交讀不能使用它的原因是不能讀取符合事物版本的行版本。它們總是讀取最新的行版本。可序列化不能使用MVCC的原因是,它總是要鎖定行。

  下面的表說明了在MySQL中不同鎖的模式以及並發層級。

鎖的策略 並發性 開銷 引擎
最低 最低 MyISAM,Merge,Memory
NDB Cluster
行和MVCC 最高 最高 InnoDB,Falcon,PBXT,solidD


MYSQL MVCC實現及其機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.