天道不一定酬所有勤
但是,天道只酬勤

天津11选5怎么玩:深入理解樂觀鎖與悲觀鎖

開發十年,就只剩下這套架構體系了??!

天津11选5蛋托玩法 www.ijudhr.com.cn 在數據庫的鎖機制中介紹過,數據庫管理系統(DBMS)中的并發控制的任務是確保在多個事務同時存取數據庫中同一數據時不破壞事務的隔離性和統一性以及數據庫的統一性。

樂觀并發控制(樂觀鎖)和悲觀并發控制(悲觀鎖)是并發控制主要采用的技術手段。

無論是悲觀鎖還是樂觀鎖,都是人們定義出來的概念,可以認為是一種思想。其實不僅僅是關系型數據庫系統中有樂觀鎖和悲觀鎖的概念,像memcache、hibernate、tair等都有類似的概念。

針對于不同的業務場景,應該選用不同的并發控制方式。所以,不要把樂觀并發控制和悲觀并發控制狹義的理解為DBMS中的概念,更不要把他們和數據中提供的鎖機制(行鎖、表鎖、排他鎖、共享鎖)混為一談。其實,在DBMS中,悲觀鎖正是利用數據庫本身提供的鎖機制來實現的。

下面來分別學習一下悲觀鎖和樂觀鎖。

悲觀鎖

當我們要對一個數據庫中的一條數據進行修改的時候,為了避免同時被其他人修改,最好的辦法就是直接對該數據進行加鎖以防止并發。

這種借助數據庫鎖機制在修改數據之前先鎖定,再修改的方式被稱之為悲觀并發控制(又名“悲觀鎖”,Pessimistic Concurrency Control,縮寫“PCC”)。

在關系數據庫管理系統里,悲觀并發控制(又名“悲觀鎖”,Pessimistic Concurrency Control,縮寫“PCC”)是一種并發控制的方法。它可以阻止一個事務以影響其他用戶的方式來修改數據。如果一個事務執行的操作都某行數據應用了鎖,那只有當這個事務把鎖釋放,其他事務才能夠執行與該鎖沖突的操作。
悲觀并發控制主要用于數據爭用激烈的環境,以及發生并發沖突時使用鎖?;な蕕某殺疽陀諢毓鍪攣竦某殺鏡幕肪持?。

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

在數據庫中,悲觀鎖的流程如下:

在對任意記錄進行修改前,先嘗試為該記錄加上排他鎖(exclusive locking)。

如果加鎖失敗,說明該記錄正在被修改,那么當前查詢可能要等待或者拋出異常。 具體響應方式由開發者根據實際需要決定。

如果成功加鎖,那么就可以對記錄做修改,事務完成后就會解鎖了。

其間如果有其他對該記錄做修改或加排他鎖的操作,都會等待我們解鎖或直接拋出異常。

MySQL InnoDB中使用悲觀鎖

Hollis為了防爬蟲以及未經授權的惡意轉載,此處內容已被作者隱藏,請輸入驗證碼查看內容
驗證碼:
請關注本站微信公眾號,回復“驗證碼”,獲取驗證碼。在微信里搜索“Hollis”或者“hollischuang”或者微信掃描右側二維碼都可以關注本站微信公眾號。

參考資料

維基百科-樂觀并發控制

維基百科-悲觀并發控制

mysql悲觀鎖總結和實踐

mysql樂觀鎖總結和實踐

樂觀鎖與悲觀鎖

(全文完) 歡迎關注『Java之道』微信公眾號
贊(10)
如未加特殊說明,此網站文章均為原創,轉載必須注明出處。天津11选5蛋托玩法 » 深入理解樂觀鎖與悲觀鎖
分享到: 更多 (0)

評論 12

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
  1. #1

    最后一句沒理解遇到什么問題,請賜教

    面向對象的旅者4年前 (2016-01-07)回復
    • 多事務并發,如果做不好事務隔離,就有可能導致臟讀、不可重復讀、幻讀等問題。//www.ijudhr.com.cn/archives/900

      HollisChuang4年前 (2016-01-07)回復
    • 是指aba的問題,修改了數據庫值再改回來你就不知道了,起不到鎖的效果

      國家公務員4年前 (2016-01-07)回復
  2. #2

    最后一句我也沒理解到,
    當兩個事務并發時,事務一提交后,如果事務二可以看見事務一提交的version,那么就可以看見事務一修改后的所有數據,這不會有問題吧,如果事務二看不見事務一提交的version,那么事務二因為version字段值不是最新的會更新失敗. version是一致贈加的,aba問題不會遇到吧,除非version值空間很小, 樂觀鎖問題還是有點疑惑???

    weixin5000443103年前 (2016-08-28)回復
    • 樂觀鎖不能防范臟數據

      visitor5554951293年前 (2016-12-30)回復
      • 為什么?幫忙解釋一下唄

        bigzuo6個月前 (01-21)回復
  3. #3

    不會出現aba問題,因為有版本號,即使改回原值,也可以知道到底有沒有修改過。

    chen_h_hui2年前 (2017-03-30)回復
  4. #4

    最后依據 是 有點 問題吧,update version 本身就存在行鎖,回寫 數據庫 是 不會存在 問題的。

    Ever2年前 (2017-08-17)回復
  5. #5

    樂觀鎖本身是update操作,id加version同樣會觸發數據庫鎖,為什么說樂觀鎖不會加鎖呢?

    姜小超1年前 (2018-04-27)回復
  6. #6

    但如果直接簡單這么做,還是有可能會遇到不可預期的結果,例如兩個事務都讀取了數據庫的某一行,經過修改以后寫回數據庫,這時就遇到了問題。 這句是不是有問題? mysql rr級別下寫操作會默認加行鎖 , 更新語句的執行是有順序的 , 通過版本號的控制 , 第二個更新操作會失敗 , 不會發生ABA的問題吧.

    紅裙翠襦1年前 (2018-05-07)回復
  7. #7

    不是每次update都會將version+1嗎,怎么會有ABA問題

    清澈的瞳孔1年前 (2018-05-09)回復
  8. #8

    很好

    呆子4個月前 (04-09)回復

HollisChuang's Blog

聯系我關于我