悲觀鎖
對數據庫加鎖,在sql語句中添加for update
,會將查詢的數據進行加鎖,在事務處理完畢後,其它事務才能對數據進行操作。此方式在高併發場景下影響性能。
樂觀鎖
上圖方案就是多線程中CAS(Compare And Swap)
概念。此方法可能會存在ABA
問題,如下圖所示:
解決方案:
1)增加版本號(version),其只能遞增,不能遞減;只要操作過程中對共享值進行修改,無論業務正常、回退或是異常,都將版本號進行遞增。
高併發場景下,上述解決方案可能會導致大量更新請求失敗。針對這種情況,可以引入重入機制
,一旦更新失敗,就重新做一次樂觀鎖流程,此方法可能會導致大量sql被執行,可以通過使用限制時間或重入次數的方式避免此問題。
時間戳限制重入:
此方法在系統忙碌時會大大減少重入的次數。
限定次數重入:
書籍資料:
《深入淺出spring boot》 作者:楊開振