樂觀鎖和悲觀鎖

2021-08-04 09:03:02 字數 1085 閱讀 4602

悲觀鎖(pessimistic lock), 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別

人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做

操作之前先上鎖。

乙個典型的倚賴資料庫的悲觀鎖呼叫: 

select * from account where name=」erica」 for update

這條 sql 語句鎖定了 account 表中所有符合檢索條件( name=」erica」 )的記錄。本次事務提交之前(事務提交時會釋放事務過程中的鎖),外界無法修改這些記錄。 

hibernate 的悲觀鎖,也是基於資料庫的鎖機制實現。下面的**實現了對查詢記錄的加鎖:

string hqlstr ="from tuser as user where user.name='erica'";

query query = session.createquery(hqlstr);

query.setlockmode("user",lockmode.upgrade); // 加鎖

list userlist = query.list();// 執行查詢,獲取資料

樂觀鎖(optimistic lock), 顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一

下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量,像資料庫如果提供

類似於write_condition機制的其實都是提供的樂觀鎖。

樂觀鎖,大多是基於資料版本   version )記錄機制實現。什麼是資料版本?即為資料增加乙個版本標識,在基於資料庫表的版本解決方案中,一般是通

過為資料庫表增加乙個 「version」 欄位來 實現。 讀取出資料時,將此版本號一同讀出,之後更新時,對此版本號加一。此時,將提 交資料的版本資料與資料

庫表對應記錄的當前版本資訊進行比對,如果提交的資料 版本號大於資料庫表當前版本號,則予以更新,否則認為是過期資料。

樂觀鎖和悲觀鎖

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

樂觀鎖和悲觀鎖

併發衝突 在多使用者的環境下,如果使用者同時修改同乙個文件,就會造成衝突。典型的衝突有兩種 1 丟失更新 乙個使用者的更新記錄覆蓋了另乙個人的更新。如 使用者一 讀 寫 使用者二 讀 寫 那麼使用者一就把使用者二的更新覆蓋了。2 髒讀 乙個使用者更新資料未完成時,另乙個使用者就讀取資訊。使用者一 讀...

樂觀鎖和悲觀鎖

為什麼需要鎖 併發控制 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 l 丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。l 髒讀...