悲觀鎖樂觀鎖簡單整理
一:介紹
悲觀鎖,正如其名,具有強烈的獨占和排他特性。它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個數據處理過程中,將數據處於鎖定狀態。悲觀鎖的實現,往往依靠數據庫提供的鎖機制(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改數據)。
樂觀鎖機制采取了更加寬松的加鎖機制。悲觀鎖大多數情況下依靠數據庫的鎖機制實現,以保證操作最大程度的獨占性。但隨之而來的就是數據庫 性能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受。相對悲觀鎖而言,樂觀鎖更傾向於開發運用。
1. 樂觀鎖是一種思想,具體實現是,表中有一個版本字段,第一次讀的時候,獲取到這個字段。處理完業務邏輯開始更新的時候,需要再次查看該字段的值是否和第一次的一樣。如果一樣更新,反之拒絕。之所以叫樂觀,因為這個模式沒有從數據庫加鎖。
2. 悲觀鎖是讀取的時候為後面的更新加鎖,之後再來的讀操作都會等待。這種是數據庫鎖
二:解決的問題
在多節點部署或者多線程執行時,同一個時間可能有多個線程更新相同數據,產生沖突,這就是並發問題。這樣的情況下會出現以下問題:
更新丟失:一個事務更新數據後,被另一個更新數據的事務覆蓋。
臟讀:一個事務讀取另一個事物為提交的數據,即為臟讀。
其次還有幻讀。。
針對並發引入並發控制機制,即加鎖。
加鎖的目的是在同一個時間只有一個事務在更新數據,通過鎖獨占數據的修改權。
三:優缺點
1、悲觀鎖,前提是,一定會有並發搶占資源,強行獨占資源,在整個數據處理過程中,將數據處於鎖定狀態。
2、樂觀鎖,前提是,不會發生並發搶占資源,只有在提交操作的時候檢查是否違反數據完整性。只能防止臟讀後數據的提交,不能解決臟讀。
兩種鎖各有優缺點,不可認為一種好於另一種,像樂觀鎖適用於寫比較少的情況下,即沖突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果經常產生沖突,上層應用會不斷的進行retry,這樣反倒是降低了性能,所以這種情況下用悲觀鎖就比較合適。
四:使用場景
1.響應速度:如果需要非常高的響應速度,建議采用樂觀鎖方案,成功就執行,不成功就失敗,不需要等待其他並發去釋放鎖
2.沖突頻率:如果沖突頻率非常高,建議采用悲觀鎖,保證成功率,如果沖突頻率大,樂觀鎖會需要多次重試才能成功,代價比較大
3.重試代價:如果重試代價大,建議采用悲觀鎖
參考
https://www.zhihu.com/question/29420056
https://yq.aliyun.com/articles/69708?spm=a2c4e.11153940.blogcont69707.72.1e5447c5h3QZjq
註:如有不妥之處,歡迎指正
悲觀鎖樂觀鎖簡單整理