MySQL之MVVC簡介

一丶什麼是MVVC?

  MVVC (Multi-Version Concurrency Control) (注:與MVCC相對的,是基於鎖的併發控制,Lock-Based Concurrency Control)是一種基於多版本的併發控制協議,只有在InnoDB引擎下存在。MVCC是爲了實現事務的隔離性,通過版本號,避免同一數據在不同事務間的競爭,你可以把它當成基於多版本號的一種樂觀鎖。當然,這種樂觀鎖只在事務級別未提交鎖和已提交鎖時纔會生效。MVCC最大的好處,相信也是耳熟能詳:讀不加鎖,讀寫不衝突。在讀多寫少的OLTP應用中,讀寫不衝突是非常重要的,極大的增加了系統的併發性能。具體見下面介紹。

二丶MVVC的實現機制

  InnoDB在每行數據都增加兩個隱藏字段,一個記錄創建的版本號,一個記錄刪除的版本號。

  在多版本併發控制中,爲了保證數據操作在多線程過程中,保證事務隔離的機制,降低鎖競爭的壓力,保證較高的併發量。在每開啓一個事務時,會生成一個事務的版本號,被操作的數據會生成一條新的數據行(臨時),但是在提交前對其他事務是不可見的,對於數據的更新(包括增刪改)操作成功,會將這個版本號更新到數據的行中,事務提交成功,將新的版本號更新到此數據行中,這樣保證了每個事務操作的數據,都是互不影響的,也不存在鎖的問題。

三丶MVVC下的CRUD

SELECT:
  當隔離級別是REPEATABLE READ時select操作,InnoDB必須每行數據來保證它符合兩個條件:
  1、InnoDB必須找到一個行的版本,它至少要和事務的版本一樣老(也即它的版本號不大於事務的版本號)。這保證了不管是事務開始之前,或者事務創建時,或者修改了這行數據的時候,這行數據是存在的。
  2、這行數據的刪除版本必須是未定義的或者比事務版本要大。這可以保證在事務開始之前這行數據沒有被刪除。
符合這兩個條件的行可能會被當作查詢結果而返回。


INSERT:

  InnoDB爲這個新行記錄當前的系統版本號。
DELETE:

  InnoDB將當前的系統版本號設置爲這一行的刪除ID。
UPDATE:

  InnoDB會寫一個這行數據的新拷貝,這個拷貝的版本爲當前的系統版本號。它同時也會將這個版本號寫到舊行的刪除版本里。


  這種額外的記錄所帶來的結果就是對於大多數查詢來說根本就不需要獲得一個鎖。他們只是簡單地以最快的速度來讀取數據,確保只選擇符合條件的行。這個方案的缺點在於存儲引擎必須爲每一行存儲更多的數據,做更多的檢查工作,處理更多的善後操作。
  MVCC只工作在REPEATABLE READ和READ COMMITED隔離級別下。READ UNCOMMITED不是MVCC兼容的,因爲查詢不能找到適合他們事務版本的行版本;它們每次都只能讀到最新的版本。SERIABLABLE也不與MVCC兼容,因爲讀操作會鎖定他們返回的每一行數據。
 

參考地址(各種鎖的原理):https://www.jianshu.com/p/59469da035e7

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章