悲觀鎖、樂觀鎖、CAS中ABA問題

悲觀鎖

對數據庫加鎖,在sql語句中添加for update,會將查詢的數據進行加鎖,在事務處理完畢後,其它事務才能對數據進行操作。此方式在高併發場景下影響性能。

樂觀鎖

在這裏插入圖片描述

上圖方案就是多線程中CAS(Compare And Swap)概念。此方法可能會存在ABA問題,如下圖所示:
在這裏插入圖片描述

解決方案:
1)增加版本號(version),其只能遞增,不能遞減;只要操作過程中對共享值進行修改,無論業務正常、回退或是異常,都將版本號進行遞增。
在這裏插入圖片描述

高併發場景下,上述解決方案可能會導致大量更新請求失敗。針對這種情況,可以引入重入機制,一旦更新失敗,就重新做一次樂觀鎖流程,此方法可能會導致大量sql被執行,可以通過使用限制時間或重入次數的方式避免此問題。

時間戳限制重入:
在這裏插入圖片描述

此方法在系統忙碌時會大大減少重入的次數。

限定次數重入:
在這裏插入圖片描述
書籍資料:
《深入淺出spring boot》 作者:楊開振

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