數據庫--鎖

樂觀鎖 悲觀鎖

悲觀鎖,顧名思義,就是很悲觀,每次拿數據的時候都認爲別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block知道它拿到鎖。傳統的關係數據庫裏邊就用到了很多這種鎖機制,比如行鎖,表鎖,讀鎖,寫鎖等,都是在做操作之前先上鎖。

樂觀鎖,顧名思義,就是很樂觀,每次拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像數據庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。

兩鎖都各有優缺點,樂觀鎖適用於寫較少的情況下,即衝突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了整個系統的吞吐量。但如果經常產生衝突,上層應用會不斷的進行retry,這樣反而會降低性能,所以這種情況下用悲觀鎖比較合適。

共享鎖 排他鎖

共享鎖,S鎖,又稱讀鎖,如果事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到事務T釋放A上的S鎖。這樣保證了其他事務可以讀A,但在事務T釋放A上的S鎖之前不能對A做任何修改。

排他鎖,X鎖,又稱寫鎖。如果事務T對對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖,這保證了其他事務在事務T釋放A上的鎖之前不能在讀區和修改A。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章