樂觀鎖與悲觀鎖使用

一、描述

悲觀鎖(Pessimistic Lock),顧名思義,就是很悲觀,每次去拿數據的時候都認爲別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關係型數據庫裏邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像數據庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。

二、使用場景

悲觀鎖(Pessimistic Lock)正如其名字,悲觀鎖(pessimistic locking)體現了一種謹慎的處事態度。其流程如下:
  • 在對任意記錄進行修改前,先嚐試爲該記錄加上排他鎖(exclusive locking)。
  • 如果加鎖失敗,說明該記錄正在被修改,那麼當前查詢可能要等待或者拋出異常。 具體響應方式由開發者根據實際需要決定。
  • 如果成功加鎖,那麼就可以對記錄做修改,事務完成後就會解鎖了。
  • 其間如果有其他對該記錄做修改或加排他鎖的操作,都會等待我們解鎖或直接拋出異常。
悲觀鎖確實很嚴謹,有效保證了數據的一致性,在C/S應用上有諸多成熟方案。

樂觀鎖(Optimistic Lock)樂觀鎖(optimistic locking)表現出大膽、務實的態度。使用樂觀鎖的前提是, 實際應用當中,發生衝突的概率比較低。他的設計和實現直接而簡潔。 目前Web應用中,樂觀鎖的使用佔有絕對優勢。樂觀鎖( Optimistic Locking ) 相對悲觀鎖而言,樂觀鎖假設認爲數據一般情況下不會造成衝突,所以在數據進行提交更新的時候,纔會正式對數據的衝突與否進行檢測,如果發現衝突了,則讓返回用戶錯誤的信息,讓用戶決定如何去做。

三、使用方法

樂觀鎖的實現:1.使用數據版本(Version)記錄機制實現,這是樂觀鎖最常用的一種實現方式。何謂數據版本?即爲數據增加一個版本標識,一般是通過爲數據庫表增加一個數字類型的 “version” 字段來實現。當讀取數據時,將version字段的值一同讀出,數據每更新一次,對此version值加一。當我們提交更新的時候,判斷數據庫表對應記錄的當前版本信息與第一次取出來的version值進行比對,如果數據庫表當前版本號與第一次取出來的version值相等,則予以更新,否則認爲是過期數據。2.類似version字段方式可以加上一個時間戳,通過對比獲取時間戳和當前數據庫時間戳是否相等,判斷數據是否被修改。

悲觀鎖的實現:悲觀鎖的實現採用的數據庫內部的鎖機制,一個典型的倚賴數據庫的悲觀鎖調用:
select * from account where name=”張三” for update
這條sql 語句鎖定了account 表中所有符合檢索條件(name=”Erica”)的記錄。本次事務提交之前(事務提交時會釋放事務過程中的鎖),外界無法修改這些記錄。也就是我們可以在查詢數據的時候先用for update把這條數據鎖住,然後更改完這條數據再提交。這樣別的線程沒法更新這條數據,也就保證了不會丟失更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章