多版本并發控制。可以認為MVCC是行級鎖的變種,但是它在很多情況下避免了加鎖操作,因此開銷更低。下面以InnoDB為例:
原理
MVCC 的實現是通過保存數據在某個時間點的快照來實現的。同一時刻同一張表,不同事務看到的數據可能是不一樣的。
實現方式
通過在給每行記錄增加兩個隱藏列,一個字段存儲創建時的時間(系統版本號),一個字段存儲刪除時的時間(系統版本號)。每開始一個新事務,系統版本號都會自動遞增。
- SELECT
InnoDB會根據以下兩個條件檢查每行記錄:
a、 InnoDB只查找版本早于當前事務版本的數據行(也就是行的系統版本號小于或等于事務的系統版本號),這樣可以保證讀取時該記錄是已經被創建好,已經存在的。
b、 行的刪除版本要么未定義,要么大于當前事務版本號。這樣可以保證該記錄在查詢時還未被刪除。 - INSERT
為新插入的每一行保存當前的系統版本號作為行版本號。 - DELETE
InnoDB為刪除的每一行保存當前系統版本號為行刪除標示。 - UPDATE
InnoDB為插入一行新記錄,保存當前系統版本號作為行版本號,同時保存當前系統版本號到原來的行作為行刪除標示。
優點:使得大多數讀操作可以不用加鎖,讀數據簡單,性能好,也能保證讀到符合標準的行。
缺點:每行記錄都需要額外的存儲空間,而且需要做更多的檢查工作,以及一些額外的維護工作。
MVCC只能在可重復讀和提交讀兩個隔離級別下工作。因為未提交讀總是讀取最新的數據行,而不是符合標準的數據行。而串行化則會對所有讀取的行都加鎖。