隨筆 - 63  文章 - 0  trackbacks - 0
          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          (轉)Hibernate支持兩種鎖機制:
          即通常所說的“悲觀鎖(Pessimistic Locking)”和
          “樂觀鎖(OptimisticLocking)”。
          悲觀鎖的實現,往往依靠數據庫提供的鎖機制(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改數據)。
          Hibernate的加鎖模式有:
          Ø LockMode.NONE : 無鎖機制。
          Ø LockMode.WRITE :Hibernate在Insert和Update記錄的時候會自動
          獲取。
          Ø LockMode.READ : Hibernate在讀取記錄的時候會自動獲取。
          以上這三種鎖機制一般由Hibernate內部使用,如Hibernate為了保證Update
          過程中對象不會被外界修改,會在save方法實現中自動為目標對象加上WRITE鎖。
          Ø LockMode.UPGRADE :利用數據庫的for update子句加鎖。
          Ø LockMode. UPGRADE_NOWAIT :Oracle的特定實現,利用Oracle的for
          update nowait子句實現加鎖。
          樂觀鎖,大多是基于數據版本(Version)記錄機制實現。何謂數據版本?即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表增加一個“version”字段來實現。讀取出數據時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對,如果提交的數據版本號大于數據庫表當前版本號,則予以更新,否則認為是過期數據。
          悲觀鎖與樂觀鎖的比較:
          悲觀鎖大多數情況下依靠數據庫的鎖機制實現,以保證操作最大程度的獨占性。但隨之而來的就是數據庫性能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受;
          相對悲觀鎖而言,樂觀鎖機制采取了更加寬松的加鎖機制。樂觀鎖機制往往基于系統中的數據存儲邏輯,因此也具備一定的局限性,如在上例中,由于樂觀鎖機制是在我們的系統中實現,來自外部系統的更新操作不受我們系統的控制,因此可能會造成臟數據被更新到數據庫中。在
          系統設計階段,我們應該充分考慮到這些情況出現的可能性,并進行相應調整(如將樂觀鎖策略在數據庫存儲過程中實現,對外只開放基于此存儲過程的數據更新途徑,而不是將數據庫表直接對外公開)。
          Hibernate 在其數據訪問引擎中內置了樂觀鎖實現。如果不用考慮外部系統對數據庫的更新操作,利用Hibernate提供的透明化樂觀鎖實現,將大大提升我們的生產力。
          Hibernate中可以通過class描述符的optimistic-lock屬性結合version描述符指定。
          optimistic-lock屬性有如下可選取值:
          Ø none
          無樂觀鎖
          Ø version
          通過版本機制實現樂觀鎖
          Ø dirty
          通過檢查發生變動過的屬性實現樂觀鎖
          Ø all
          通過檢查所有屬性實現樂觀鎖
          其中通過version實現的樂觀鎖機制是Hibernate官方推薦的樂觀鎖實現,同時也是Hibernate中,目前唯一在數據對象脫離 Session發生修改的情況下依然有效的鎖機制。因此,一般情況下,我們都選擇version方式作為Hibernate樂觀鎖實現機制。
          posted on 2009-04-12 16:12 lanxin1020 閱讀(184) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 方正县| 泌阳县| 罗田县| 通山县| 闻喜县| 奈曼旗| 会理县| 项城市| 丹寨县| 溧水县| 鸡西市| 枣强县| 华阴市| 敦煌市| 青神县| 古丈县| 龙游县| 沙田区| 盐津县| 如东县| 清涧县| 洛宁县| 青河县| 吴江市| 江津市| 沙河市| 将乐县| 福海县| 望江县| 柘城县| 合作市| 张北县| 郁南县| 合阳县| 房产| 德惠市| 南开区| 兴隆县| 岚皋县| 四川省| 姜堰市|