hibernate鎖機制

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樂觀鎖實現機制
發佈了28 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章