什麼是悲觀鎖和樂觀鎖?

2022-02-26 15:01:49 字數 1889 閱讀 6269

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

樂觀鎖(optimistic lock), 顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量,像資料庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。

格式 select…for update

例:select * from account where name="erica" for update

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

格式 select…for update nowait

該關鍵字的含義是「不用等待,立即返回」,如果當前請求的資源被其他會話鎖定時,會發生阻塞,nowait可以避免這一阻塞。

mysql中用悲觀鎖務必須確定走了索引,而不是全表掃瞄,否則將會將整個資料表鎖住。

現在網際網路高併發的架構中,受到fail-fast思路的影響,悲觀鎖已經非常少見了。

樂觀鎖,大多是基於資料版本 ( version )記錄機制實現。何謂資料版本?即為資料增加乙個版本標識,在基於資料庫表的版本解決方案中,一般是通過為資料庫表增加乙個 「version」 欄位來實現。

讀取出資料時,將此版本號一同讀出,之後更新時,對此版本號加一。此時,將提交資料的版本資料與資料庫表對應記錄的當前版本資訊進行比對,如果提交的資料版本號大於資料庫表當前版本號,則予以更新,否則認為是過期資料。

要使用悲觀鎖,我們必須關閉mysql資料庫的自動提交屬性,因為mysql預設使用autocommit模式,也就是說,當你執行乙個更新操作後,mysql會立刻將結果進行提交。set autocommit=0;

使用start transaction,自動提交將保持禁用狀態,直到你使用commit或rollback結束事務。 自動提交模式然後恢復到之前的狀態(如果start transaction 前 autocommit = 1,則完成本次事務後 autocommit 還是 1。如果 start transaction 前 autocommit = 0,則完成本次事務後 autocommit 還是 0)

通過減小鎖的粒度,可以提高系統的吞吐量;如以下實現邏輯,只要庫存》1,事務就可以成功更新庫存數量;如果採用傳統的 version 在高併發的情況下可能會導致大量的併發事務更新失敗。

//

仍挑選以庫存數作為樂觀鎖

//step1: 查詢出商品資訊

select (inventory) from items where id=100;

//step2: 根據商品資訊生成訂單

insert into orders(id,item_id) values(null,100);

//step3: 修改商品的庫存

update items set inventory=inventory-1 where id=100 andinventory > 1;

兩種鎖各有優缺點,不可認為一種好於另一種,像樂觀鎖適用於寫比較少的情況下,即衝突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果經常產生衝突,上層應用會不斷的進行retry,這樣反倒是降低了效能,所以這種情況下用悲觀鎖就比較合適。

悲觀鎖和樂觀鎖

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

悲觀鎖和樂觀鎖

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

悲觀鎖和樂觀鎖

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