樂觀鎖與悲觀鎖使用場景

情景

現在有兩個倉庫管理員A和B,他們共同管理一個倉庫,倉庫裏有10件商品。A收到一條通知要取1件商品,B也收到一條通知要取2個。A去倉庫一查有10件,他取了一件。在他修改倉庫前,B來了一查倉庫有10個取了兩個,A更新倉庫將才倉庫更新爲9,B也更新倉庫將倉庫更新爲8。此時倉庫的個數爲8(B將A更新的覆蓋了)而倉庫實際的個數爲7個。如果一直這樣下去的話一定會出現問題。

解決方法一(悲觀鎖)

悲觀鎖就是在他們在任何一個人取的時候要將倉庫加上鎖不允許別人操作。也就說,當A操作倉庫的時候將倉庫加了一把鎖.B看到鎖後B明白有人在操作,那麼B就不會操作倉庫,B就會一直等到A操作完B纔可以操作。在A的心態很悲觀,他老是認爲在他操作的時候總有人來操作倉庫,所以A加了一把鎖。這把鎖就是悲觀鎖,上面所述的就是悲觀鎖的思路。這樣做確實解決了一些問題但是如果鎖的時間太長,其他用戶會等待很長時間。

解決方法二(樂觀鎖)

樂觀鎖是相對與悲觀鎖的存在的,也就是說,A和B達成了一個協議,而且A很樂觀他認爲其他人不會來操作倉庫所以他沒有加鎖,但是他們操作倉庫的時候多加一個字段如倉庫的版本(還可以是時間戳),當A操作的時候倉庫的版本爲1,倉庫的數量爲10。每次當操作倉庫的時候讀的時候不僅要讀出倉庫的數量還要讀出倉庫的版本。當你往回寫的時候看一下版本是否一致,如果一致的話就直接寫回去,如果不一致的話將放棄本次的操作從新來。這就是樂觀鎖,也就是說在任何人操做數據只有在更新的時候纔去看是否有衝突。但是呢這樣也會有問題如果衝突數量過多的時候,會不斷的去操作數據,會降低性能。

樂觀鎖和悲觀鎖都是思考問題的一種方式,並不只侷限於數據庫的應用。還有其他的應用:例如CAS和線程同步等。

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