悲觀鎖 樂觀鎖解析

2021-08-17 09:49:12 字數 1455 閱讀 6466

1.悲觀鎖 樂觀鎖

樂觀鎖:樂觀的認為在自己讀資料到更新完資料的這段時間,別人不會更新資料,當自己更新資料的時候才會去判斷該去期間資料是否被人更新過。沒有,更新資料;有,重試。主要用於多讀的併發開發中。

悲觀鎖:悲觀的認為在自己拿資料到更新的這段時間內,該資料會被其他人更新掉。保證資料安全穩定。主要用於多寫的併發開發中。

出現的場景:併發程式設計中。

併發中不使用樂觀鎖/悲觀鎖的反面例子: 

a賬戶有100元,a,b兩個人併發的分別從a賬戶上去取50,20元,正常情況下a賬戶剩餘30元。在沒有鎖的時候會出現這種情況。 

1> a先拿到100元,然後減50剩餘50。。 

2> 同時b拿到100元,之後減去30剩餘70.。。 

3> 這時a先更新資料庫,a賬戶上有50,然後b操作更新a賬戶剩餘70.。。 

4> 結果a賬戶上的餘額對不上。

樂觀鎖的實現方式: 

5.1> 在a賬戶的表中增加乙個版本的字段version 

5.2> a先拿到a賬戶的餘額100以及版本version=1,扣掉50,version+1=2, 

5.3> b拿到a賬戶的餘額100以及版本是version=1,扣掉20,version+1=2, 

5.4> a執行更新操作時,先判斷更新的version是否大於資料庫中的version,大於更新資料,此時a賬戶餘額50,version版本=2。 

5.5> b執行更新操作時,先判斷更新的版本version是否大於資料庫中version,非大於資料庫中version,不滿足「提交版本大於資料庫記錄版本」,更新資料操作提交被駁回。執行重試機制(retry)。 

5.6> retry機制,b重新獲取a賬戶餘額50,扣掉20,version+1=3,更新資料庫操作,提交版本大於資料庫記錄版本,更新資料庫記錄,此時a賬戶餘額30.

悲觀鎖的實現方式: 

6.1> a賬戶中餘額100, 

6.2> a取出a賬戶的記錄且鎖住該條記錄,不允許其他執行緒操作該條記錄, 

6.3> b想取出a賬戶的記錄,但是該條記錄被鎖住,無法獲取,等待解鎖 

6.4> a扣掉50,並更新資料記錄。然後釋放鎖 

6.5> a賬戶的鎖被釋放,b取得該條記錄,並鎖住該條記錄不允許其他執行緒訪問 

6.6> b扣掉20,並更新資料記錄,然後釋放鎖。此時a賬戶中餘額30.

總結 7.1> 樂觀鎖的優點: 

1> 在處理讀多寫少的情況下可以提高系統吞吐量,只在寫的時候才會鎖 

2> 不會產生死鎖的情況 

樂觀鎖的缺點: 

1> 在加上鎖,會導致系統額外的開銷 

2> 在寫多的情況下會出現多次retry的情況 

7.2> 悲觀鎖的優點: 

1> 先鎖在取資料,更新資料,保證了資料安全。 

悲觀鎖的缺點: 

1> 在讀多寫少的情況下,額外提高系統開銷 

2> 可能會出現死鎖的情況 

3> 降低系統並行能力

悲觀鎖樂觀鎖

1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...

樂觀鎖 悲觀鎖

悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...

樂觀鎖 悲觀鎖

樂觀鎖 悲觀鎖 悲觀鎖 pessimistic locking 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保...