假定併發環境是悲觀的,如果發生併發衝突,就會破壞一致性,所以要通過獨佔鎖徹底禁止衝突發生。有乙個經典比喻,「如果你不鎖門,那麼搗蛋鬼就回闖入並搞得一團糟」,所以「你只能一次開啟門放進乙個人,才能時刻盯緊他」。
假定併發環境是樂觀的,即,雖然會有併發衝突,但衝突可發現且不會造成損害,所以,可以不加任
何保護,等發現併發衝突後再決定放棄操作還是重試。可模擬的比喻為,「如果你不鎖門,那麼雖然搗蛋鬼會闖入,但他們一旦打算破壞你就能知道」,所以「你大可以放進所有人,等發現他們想破壞的時候再做決定」。
通常認為樂觀鎖的效能比悲觀所更高,特別是在某些複雜的場景。這主要由於悲觀鎖在加鎖的同時,也會把某些不會造成破壞的操作保護起來;而樂觀鎖的競爭則只發生在最小的併發衝突處,如果用悲觀鎖來理解,就是「鎖的粒度最小」。但樂觀鎖的設計往往比較複雜,因此,複雜場景下還是多用悲觀鎖。首先保證正確性,有必要的話,再去追求效能。
樂觀鎖的實現往往需要硬體的支援,多數處理器都都實現了乙個 cas 指令,實現「compare and swap」的語義(這裡的 swap 是「換入」,也就是 set),構成了基本的樂觀鎖。
乙個有意思的事實是,「使用 cas 控制併發」與「使用樂觀鎖」並不等價。cas 只是一種手段,既可以實現樂觀鎖,也可以實現悲觀鎖。樂觀、悲觀只是一種併發控制的策略。
悲觀鎖和樂觀鎖
1.悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...
悲觀鎖和樂觀鎖
前幾天有人問了我乙個問題,說如果資料庫某些操作不用事務,那麼又需要保持資料的一致性,那麼該用什麼方法替代事務。我就想到了悲觀鎖和樂觀鎖的思想,下面我解釋一下在資料庫中的悲觀鎖和樂觀鎖 1.悲觀鎖就是把資料庫的一些操作,放在事務當中,依賴資料庫的隔離級別,實現對資料修改的封鎖,這樣做資料一致性可以保持...
悲觀鎖和樂觀鎖
悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...