併發系統-鎖管理解析

併發控制

數據庫管理系統中的併發控制的任務是確保在多個事務同時存取數據庫中同一數據時不破壞事務的隔離性和統一性以及數據庫的統一性。

樂觀併發控制(樂觀鎖)和悲觀併發控制(悲觀鎖)是併發控制主要採用的技術手段

  • 悲觀鎖

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

假定會發生併發衝突,屏蔽一切可能違反數據完整性的操作

悲觀鎖實現方法

加鎖一般通過以下方法實現:

Criteria.setLockMode

Query.setLockMode

Session.lock

注意,只有在查詢開始之前(也就是 Hiberate 生成 SQL 之前)設定加鎖,才會

真正通過數據庫的鎖機制進行加鎖處理,否則,數據已經通過不包含 for update

子句的 Select SQL 加載進來,所謂數據庫加鎖也就無從談起。

  • 樂觀鎖

採取了更加寬鬆的加鎖機制。悲觀鎖大多數情況下依靠數據庫的鎖機制實現,以保證操作最大程度的獨佔性。但隨之而來的就是數據庫 性能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受。相對悲觀鎖而言,樂觀鎖更傾向於開發運用。

樂觀鎖實現

代碼將在 tx.commit() 處拋出

StaleObjectStateException 異常,並指出版本檢查失敗,當前事務正在試圖提交一個過期數據。通過捕捉這個異常,我們就可以在樂觀鎖校驗失敗時進行相應處理。

假設不會發生併發衝突,只在提交操作時檢查是否違反數據完整性。

應用場景及缺點

悲觀鎖應用場景:寫操作多的情況

悲觀鎖缺點:讀寫速度慢,開銷大

樂觀鎖應用場景:讀操作多的情況

樂觀鎖缺點:多次重試佔用大量資源

基本應用

悲觀鎖

synchronized

reentrantlock

樂觀鎖

concurrenthashmap

併發系統-鎖管理解析



分享到:


相關文章: