MVCC

多版本并發控制。可以認為MVCC是行級鎖的變種,但是它在很多情況下避免了加鎖操作,因此開銷更低。下面以InnoDB為例:

原理

MVCC 的實現是通過保存數據在某個時間點的快照來實現的。同一時刻同一張表,不同事務看到的數據可能是不一樣的。

實現方式

通過在給每行記錄增加兩個隱藏列,一個字段存儲創建時的時間(系統版本號),一個字段存儲刪除時的時間(系統版本號)。每開始一個新事務,系統版本號都會自動遞增。

  • SELECT
    InnoDB會根據以下兩個條件檢查每行記錄:
    a、 InnoDB只查找版本早于當前事務版本的數據行(也就是行的系統版本號小于或等于事務的系統版本號),這樣可以保證讀取時該記錄是已經被創建好,已經存在的。
    b、 行的刪除版本要么未定義,要么大于當前事務版本號。這樣可以保證該記錄在查詢時還未被刪除。
  • INSERT
    為新插入的每一行保存當前的系統版本號作為行版本號。
  • DELETE
    InnoDB為刪除的每一行保存當前系統版本號為行刪除標示。
  • UPDATE
    InnoDB為插入一行新記錄,保存當前系統版本號作為行版本號,同時保存當前系統版本號到原來的行作為行刪除標示。
    優點:使得大多數讀操作可以不用加鎖,讀數據簡單,性能好,也能保證讀到符合標準的行。
    缺點:每行記錄都需要額外的存儲空間,而且需要做更多的檢查工作,以及一些額外的維護工作。
    MVCC只能在可重復讀和提交讀兩個隔離級別下工作。因為未提交讀總是讀取最新的數據行,而不是符合標準的數據行。而串行化則會對所有讀取的行都加鎖。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容