[英]Concurrent updates handling in hibernate
目前我們在數據層中使用JDBC並計划用hibernate替換它。 我是Hibernate的新手,不知道hibernate如何處理並發。 如果我們使用spring進行事務管理,可以解釋一下,如何處理並發更新:通過hibernate(在hibernate的內存自動版本管理中)或者我必須將數據列放在數據庫中以手動處理並發更新。
如果我們使用spring進行事務管理,hibernate將如何處理並發更新(在hibernate的內存自動版本管理中),或者我必須將數據列放在數據庫中以手動處理並發更新,有人可以解釋一下。
無論您是否使用Spring進行事務管理並不重要,並且在並發管理方面並不重要,這實際上是由Hibernate處理的。 Hibernate可以使用2種策略來處理並發更新:樂觀鎖定和悲觀鎖定。
使用樂觀鎖定時,您將特殊屬性(數字,時間戳)映射為版本 (因此您實際上有一個列)。 當您檢索實體並在更新期間包含在where子句中並通過Hibernate 遞增時,將讀取此版本。
為了說明這是如何工作的,讓我們假設您通過id = 1和當前版本= 1加載Person實體。 保存后,Hibernate將執行以下操作:
update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;
所以,現在,假設您有兩個並發事務正在運行,每個事務都加載相同的實體(相同的版本號)並更改名稱。
假設事務#1首先被提交,執行以下查詢:
update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;
它成功了,版本增加了。
然后提交事務#2,執行以下查詢:
update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;
這個不會更新任何東西因為where子句不匹配任何記錄。 這是您將獲得樂觀並發異常的地方。
當您不維護連接,並發訪問不頻繁且擴展性非常好時,此策略是合適的。 當然,只要您映射版本屬性,Hibernate就會透明地處理所有內容。
當使用悲觀鎖定時,Hibernate會鎖定一條記錄供您獨占使用,直到您完成它(通常使用SELECT ... FOR UPDATE
)。 嘗試訪問同一記錄的任何其他並發事務將被暫停,直到鎖定被刪除。 該策略以性能價格提供更好的可預測性,並且無法無限擴展。
有像objectDB這樣的JPA實現,其中默認激活樂觀鎖定,用戶不需要在數據庫表中維護版本變量,因為它在內部由objectDB處理。 樂觀鎖定在不經常更新的情況下很好,並且鎖定具有隱含成本,例如電子商務中鎖定意味着業務損失。 悲觀鎖定是不需要並發性很快並且事務快速完成以釋放資源的理想選擇。
在Hibernate社區維基上有一些關於會話和事務的文檔 。 它最終由底層的RDBMS事務處理,但您需要注意加載或保存的對象的生命周期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.