博客 / 詳情

返回

什麼是計算機編程領域的樂觀鎖和悲觀鎖

樂觀鎖和悲觀鎖是計算機編程領域中用於處理併發訪問數據的兩種不同策略。它們的主要目標是在多個線程或進程同時訪問共享數據時,保證數據的一致性和完整性,避免出現競態條件(Race Condition)。在不同的情景下,選擇合適的鎖策略可以提高程序的性能和可靠性。

1. 悲觀鎖(Pessimistic Locking):

悲觀鎖假定在操作數據時,會發生競態條件,因此默認情況下將數據鎖定,防止其他線程或進程同時修改數據。這種策略認為併發衝突是常態,因此在數據訪問時會加上鎖,以確保每次只有一個線程可以訪問數據,從而避免併發問題。

示例
假設有一個銀行賬户,多個用户可以同時訪問並進行取款操作。使用悲觀鎖,當一個用户開始取款時,系統會將賬户數據加鎖,直到該用户完成取款操作。其他用户必須等待鎖釋放,才能進行操作。

在數據庫中,悲觀鎖可以使用SELECT ... FOR UPDATE語句來實現。當一個事務執行該語句時,它會鎖定選定的行,直到事務完成。

2. 樂觀鎖(Optimistic Locking):

樂觀鎖的思想是,大多數情況下,數據的併發衝突是很少發生的,因此不採取過多的鎖定,而是在更新數據之前先進行一次檢查,確認數據是否被其他線程修改過。如果沒有被修改,就進行更新操作,否則,重新嘗試或者進行衝突處理。

示例
考慮一個在線購物網站,多個用户可以同時購買同一商品。使用樂觀鎖,每個商品記錄會有一個版本號。當用户要購買商品時,系統會讀取商品的版本號,然後用户提交訂單時,系統會再次檢查版本號,如果版本號一致,就執行購買操作,然後將版本號遞增;如果版本號不一致,意味着在用户瀏覽商品和購買之間有其他用户修改了數據,那麼系統會提示用户重新確認購買操作。

在數據庫中,樂觀鎖可以通過添加一個版本號字段來實現。在更新數據時,檢查當前版本號是否與預期版本號匹配,如果匹配則執行更新,否則表示數據已被修改。

選擇合適的鎖策略:

選擇悲觀鎖還是樂觀鎖取決於具體的應用場景和併發訪問模式。

  • 悲觀鎖適用於:併發衝突非常頻繁,數據修改操作複雜,競爭較激烈的情況。然而,悲觀鎖可能導致系統性能下降,因為它會頻繁地阻塞等待鎖。
  • 樂觀鎖適用於:併發衝突相對較少,大部分情況下數據是安全的,只有極少數情況下才會出現競態條件的情況。樂觀鎖不會引入太多的鎖開銷,但需要在衝突處理方面考慮更多的邏輯。

在實際應用中,可以根據業務需求和性能要求選擇合適的鎖策略,甚至可以在同一個系統中同時使用悲觀鎖和樂觀鎖,針對不同的數據進行不同的處理。

總結:

樂觀鎖和悲觀鎖是處理併發訪問數據的兩種主要策略。悲觀鎖假設併發衝突是常態,會在數據訪問時加鎖,以避免競態條件。樂觀鎖則假設併發衝突較少,先進行操作並在更新前檢查數據是否被修改過。在實際應用中,根據併發訪問模式和性能需求,選擇合適的鎖策略是確保數據一致性和程序可靠性的關鍵。

user avatar kuaishoutech 頭像 teamcode 頭像
2 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.