2013-08-27 90 views
2

以下運行平衡是一個表結構更新使用休眠在多用戶環境中

enter image description here

餘額=原始金額+餘額(前面)

50 = 50 + 0 ID(1)

200 = 150 + 50 ID(2)

相對於第二行,我們如何可使用休眠session.save()更新餘額;我試圖寫出插入查詢,但知道HQL不支持插入值,但從其他表中選擇。

In HQL, only the INSERT INTO … SELECT … is supported; there is no INSERT INTO … VALUES. HQL only support insert from another table.[source]

如果使用休眠,I first get the balance of max id of customer 1then pass the balance to the new object,那麼這將是OK!

但在多用戶環境下,由於one user get the balance of max id of customer 1,與此同時other user insert the new row and update the balance。那麼獲得餘額的第一個用戶是舊的because when first user transaction geting the balance other user insert new row and update balance。在這種情況下,第一個用戶事務處理會在更新第二個用戶事務之前插入相對於之前獲得的餘額的錯誤餘額。

休眠是否有公告功能來控制這種情況?

我們如何使用hibernate session.save()以最新的餘額保存事務。 ?

更新我!

+0

應該如何冬眠知道第2排的依賴於第1行的一些疑問? – xwoker

回答

0

由於代表錶行的實體彼此獨立,因此hibernate無法知道餘額的計算是基於過時的數據。

溶液1(迄今爲止我優選一個):計算平衡在DB(使用觸發器)和標記的平衡屬性作爲

@Generated(值= GenerationTime.ALWAYS)

這樣實體會在寫入後更新。休眠和數據庫將負責其餘部分。

如果你必須做應用層面的平衡計算與一些缺點多種解決方案浮現在腦海中:

解決方案2:不要使用用戶事務提交多用戶相關的數據。

創建一些東西(例如某些排隊機制)來序列化保存請求。在用戶獨立事務中執行處理。

缺點:用戶不會看到存儲在數據庫中的餘額(但您可能會顯示暫時的「預測餘額」做當前的計算),並且您有更復雜的應用程序邏輯和瓶頸序列化。

解決方案3:寫(潛在的)錯誤的數據(或保留爲空) - 更新後

如果你將存儲你的計算中使用的新實體的實體的ID,你可以檢查重複(兩個實體基於同一實體的餘額)並更新該值。

缺點:與解決方案2類似,但沒有瓶頸,因爲可以在後臺任務中完成更新。

解決方案4:重構數據模型以刪除實體之間的依賴關係(用於寫入)。

您可以使平衡瞬變(並計算它,如果你必須顯示或使用它)。

缺點:只適用於項目的中等數量並刪除從DB這個數據可能妨礙您可能需要執行