多版本并發(fā)控制〗酰可以認為MVCC是行級鎖的變種擒贸,但是它在很多情況下避免了加鎖操作,因此開銷更低觉渴。下面以InnoDB為例:
原理
MVCC 的實現(xiàn)是通過保存數(shù)據(jù)在某個時間點的快照來實現(xiàn)的介劫。同一時刻同一張表,不同事務(wù)看到的數(shù)據(jù)可能是不一樣的案淋。
實現(xiàn)方式
通過在給每行記錄增加兩個隱藏列座韵,一個字段存儲創(chuàng)建時的時間(系統(tǒng)版本號),一個字段存儲刪除時的時間(系統(tǒng)版本號)踢京。每開始一個新事務(wù)誉碴,系統(tǒng)版本號都會自動遞增。
- SELECT
InnoDB會根據(jù)以下兩個條件檢查每行記錄:
a瓣距、 InnoDB只查找版本早于當前事務(wù)版本的數(shù)據(jù)行(也就是行的系統(tǒng)版本號小于或等于事務(wù)的系統(tǒng)版本號)黔帕,這樣可以保證讀取時該記錄是已經(jīng)被創(chuàng)建好,已經(jīng)存在的蹈丸。
b成黄、 行的刪除版本要么未定義呐芥,要么大于當前事務(wù)版本號。這樣可以保證該記錄在查詢時還未被刪除奋岁。 - INSERT
為新插入的每一行保存當前的系統(tǒng)版本號作為行版本號思瘟。 - DELETE
InnoDB為刪除的每一行保存當前系統(tǒng)版本號為行刪除標示。 - UPDATE
InnoDB為插入一行新記錄厦取,保存當前系統(tǒng)版本號作為行版本號潮太,同時保存當前系統(tǒng)版本號到原來的行作為行刪除標示。
優(yōu)點:使得大多數(shù)讀操作可以不用加鎖虾攻,讀數(shù)據(jù)簡單铡买,性能好,也能保證讀到符合標準的行霎箍。
缺點:每行記錄都需要額外的存儲空間奇钞,而且需要做更多的檢查工作,以及一些額外的維護工作漂坏。
MVCC只能在可重復(fù)讀和提交讀兩個隔離級別下工作景埃。因為未提交讀總是讀取最新的數(shù)據(jù)行,而不是符合標準的數(shù)據(jù)行顶别。而串行化則會對所有讀取的行都加鎖谷徙。