樂觀鎖和 MVCC 的區別

作者:用心閣
鏈接:https://www.zhihu.com/question/27876575/answer/71836010
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

在數據庫中,併發控制是指在多個用戶/進程/線程同時對數據庫進行操作時,如何保證事務的一致性和隔離性的,同時最大程度地併發。當多個用戶/進程/線程同時對數據庫進行操作時,會出現3種衝突情形:讀-讀,不存在任何問題讀-寫,有隔離性問題,可能遇到髒讀(會讀到未提交的數據) ,幻影讀等。寫-寫,可能丟失更新要解決衝突,一種辦法是是鎖,即基於鎖的併發控制,比如2PL,這種方式開銷比較高,而且無法避免死鎖。多版本併發控制(MVCC)是一種用來解決讀-寫衝突的無鎖併發控制,也就是爲事務分配單向增長的時間戳,爲每個修改保存一個版本,版本與事務時間戳關聯,讀操作只讀該事務開始前的數據庫的快照。 這樣在讀操作不用阻塞寫操作,寫操作不用阻塞讀操作的同時,避免了髒讀和不可重複讀樂觀併發控制(OCC)是一種用來解決寫-寫衝突的無鎖併發控制,認爲事務間爭用沒有那麼多,所以先進行修改,在提交事務前,檢查一下事務開始後,有沒有新提交改變,如果沒有就提交,如果有就放棄並重試。樂觀併發控制類似自選鎖。樂觀併發控制適用於低數據爭用,寫衝突比較少的環境。多版本併發控制可以結合基於鎖的併發控制來解決寫-寫衝突,即MVCC+2PL,也可以結合樂觀併發控制來解決寫-寫衝突。

作者:吳鏑
鏈接:https://www.zhihu.com/question/27876575/answer/73330077
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

MVCC解決的問題是讀寫互相不阻塞的問題,每次更新都產生一個新的版本,讀的話可以讀歷史版本。試想,如果一個數據只有一個版本,那麼多個事務對這個數據進行讀寫是不是需要讀寫鎖來保護? 一個讀寫事務在運行的過程中在訪問數據之前先加讀/寫鎖這種實現叫做悲觀鎖,悲觀體現在,先加鎖,獨佔數據,防止別人加鎖。樂觀鎖呢,讀寫事務,在真正的提交之前,不加讀/寫鎖,而是先看一下數據的版本/時間戳,等到真正提交的時候再看一下版本/時間戳,如果兩次相同,說明別人期間沒有對數據進行過修改,那麼就可以放心提交。樂觀體現在,訪問數據時不提前加鎖。在資源衝突不激烈的場合,用樂觀鎖性能較好。如果資源衝突嚴重,樂觀鎖的實現會導致事務提交的時候經常看到別人在他之前已經修改了數據,然後要進行回滾或者重試,還不如一上來就加鎖。

發佈了44 篇原創文章 · 獲贊 36 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章