樂觀鎖和 MVCC 的區別

2021-08-03 01:51:07 字數 942 閱讀 2312

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

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

樂觀鎖和悲觀鎖的區別

悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...

樂觀鎖和悲觀鎖的區別

來自 悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 op...

樂觀鎖和悲觀鎖的區別

悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...