天天看點

InnoDB的多版本并發控制(MVCC)

前言

這篇文章介紹MySQL裡面InnoDB引擎事務的多版本并發控制機制(MVCC),可以用來實作兩種事務的隔離級别:read committed和repeatable read(關于事務隔離級别的介紹,可以參考這篇文章:https://blog.csdn.net/qq_33290787/article/details/51924963)。同時MVCC解決了repeatable read中可能出現的幻讀的問題。

實作

MVCC的核心就是給每行資料增加了兩個隐藏的列,一個是修改這行的最後的系統版本号(system version number),一個是删除該行的系統版本号。每開始一個新事物,系統版本号就會遞增。事務開始的時候,系統版本号會作為目前事務的版本号,用來查詢和操作。

SELECT:

    a. InnoDB隻會讀取版本号小于等于該事務版本号的所有資料行,這樣保證了事務進行時,所有的行要麼是事務進行前已經存在,要麼是事務自身插入或者修改的(這樣實作了事務重複讀取資料一緻,同時不會出現幻讀的現象)

    b. 同時讀取的行的删除版本号要麼是未設定的,要麼大于目前事務版本号,這樣保證該行在事務開始前沒有被删除。

INSERT:

    InnoDB為新插入的每一行儲存目前的系統版本号作為行版本号。

DELETE:

    InnoDB為删除的每一行儲存目前系統版本号作為删除版本号。

UPDATE:

    InnoDB将更新資料插入新一行,将事務版本号作為新一行的行版本号,同時将老一行的删除版本号置為目前事務版本号。

優缺點

優點:1. 在事務中,大多數的讀操作不需要加鎖     2. 解決了repeatable read中幻讀的問題

缺點:1. 每行記錄都需要額外的存儲空間 2. 需要更多的行檢查和維護工作

一點感想

資料版本号在我們日常工作中很多地方都可以發揮作用:例如實作幂等、簡單的樂觀鎖機制等等。希望之後能夠多學習多實踐,有朝一日能夠比較完善地總結一下資料版本号的各種用途。

繼續閱讀