悲觀鎖和樂觀鎖的區別和應用場景


1.早上提醒項目提前上線下午兩點至三點

2.導出兩張模板,生產環境需要導出CSR一張表方便以后查看

 

 

3.這問題讓我聯系很多情景下應用的鎖,分布式鎖、JAVA中線程同步鎖、mysql死鎖檢測機制、緩存鎖等,在關系型數據庫里又有行鎖,表鎖,讀鎖,寫鎖等鎖,這個問題我覺得理解它是多向的,什么情況使用鎖呢?

在多用戶環境中,在同一時間可能會有多個用戶更新相同的記錄,這會產生沖突最有效的辦法就是加入鎖;

悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖,實現悲觀鎖首先,在要鎖定的表里,加一個字段如 lock_at 時間標志,表示當前記錄被鎖定時的時間, 當為 0 時,表示該記錄未被鎖定,當要修改某個記錄時,先看看當前時間與 lock_at 字段相差是否超過預定的一個時長T,比如 30 分鍾 ,1 小時 之類的,如果沒超過,說明該記錄有人正在修改,我們暫時不能修改。 否則,說明可以修改,主要通過這個時間戳實現的。

樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制,實現樂觀鎖在程序里面我們需要定義兩個方法,分別是使用樂觀鎖返回版本號沒有使用鎖返回null,在添加一條記錄前,再次讀取這個記錄的版本號 字段,與之前讀取的值進行比對,

  • 如果版本號不同,說明在用戶修改過程中,這個記錄被別人改動過了。那么, 我們要給出提示。
  • 如果版本號 相同,說明這個記錄未被修改過。那么,對版本號  +1, 並保存這個記錄。這樣子就完成了記錄的更新。同時,該記錄的版本號也加了1。

zookeeper的數據可以支持臨時節點的概念,即客戶端寫入的數據是臨時數據,在客戶端宕機后,臨時數據會被刪除,這樣就實現了鎖的異常釋放。使用這樣的方式,就不需要給鎖增加超時自動釋放的特性了。

緩存鎖redis中SETNX 命令就搞定了,返回1代表加鎖成功,返回0 表示鎖被占用着。然后再用 DEL ***命令解鎖,返回1表示解鎖成功,0表示已經被解鎖過

 

http://www.digpage.com/lock.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM