Java 中的悲觀鎖和樂觀鎖的實現

2021-08-06 07:00:10 字數 975 閱讀 9567

一、定義

1.悲觀鎖:即很悲觀,每次拿資料的時候都覺得資料會被人更改,所以拿資料的時候就把這條記錄鎖掉,這樣別人就沒法改這條資料了,一直到你的鎖釋放。

2.樂觀鎖:即很樂觀,查詢資料的時候總覺得不會有人更改資料,等到更新的時候再判斷這個資料有沒有被人更改,有人更改了則本次更新失敗。

二、實現過程

2.悲觀鎖:悲觀鎖的實現採用的資料庫內部的鎖機制,乙個典型的倚賴資料庫的悲觀鎖呼叫:

select * from account where name=」張三」 for update

這條sql 語句鎖定了account 表中所有符合檢索條件(name=」erica」)的記錄。本次事務提交之前(事務提交時會釋放事務過程中的鎖),外界無法修改這些記錄。也就是我們可以在查詢資料的時候先用for update把這條資料鎖住,然後更改完這條資料再提交。這樣別的執行緒沒法更新這條資料,也就保證了不會丟失更新。

2.1.悲觀鎖帶來的效能問題。我們試想乙個場景:如乙個金融系統,當某個操作員讀取使用者的資料,並在讀出的使用者資料的基礎上進行修改時(如更改使用者帳戶餘額),如果採用悲觀鎖機制,也就意味著整個操作過程中(從操作員讀出資料、開始修改直至提交修改結果的全過程),資料庫記錄始終處於加鎖狀態,可以想見,如果面對幾百上千個併發,這樣的情況將導致怎樣的後果?所以我們這個時候可以使用樂觀鎖。

1.樂觀鎖:樂觀鎖的實現可以通過在表裡面加乙個版本號的形式,下面是乙個例項。

講解:也就是每個人更新的時候都會判斷當前的版本號是否跟我查詢出來得到的版本號是否一致,不一致就更新失敗,一致就更新這條記錄並更改版本號。

二、使用場景

像樂觀鎖適用於寫比較少的情況下,即衝突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果經常產生衝突,

上層應用會不斷的進行retry,這樣反倒是降低了效能,所以這種情況下用悲觀鎖就比較合適。

悲觀鎖和樂觀鎖

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

悲觀鎖和樂觀鎖

前幾天有人問了我乙個問題,說如果資料庫某些操作不用事務,那麼又需要保持資料的一致性,那麼該用什麼方法替代事務。我就想到了悲觀鎖和樂觀鎖的思想,下面我解釋一下在資料庫中的悲觀鎖和樂觀鎖 1.悲觀鎖就是把資料庫的一些操作,放在事務當中,依賴資料庫的隔離級別,實現對資料修改的封鎖,這樣做資料一致性可以保持...

悲觀鎖和樂觀鎖

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