2011-03-25 75 views
10

我想通過1使用Hibernate來增加在數據庫表中的字段。休眠:增加一個整型字段

我可以通過簡單地加載一個對象,增加值和更新但對象如果另一個線程來臨時,在負載和更新則該值將損壞之間更新的領域做到這一點。

所以不是我呼籲直接對數據庫進行更新:

Query updateHits = createQuery(
    "UPDATE Job SET hitCount = hitCount + 1 WHERE id = :jobId"); 
updateHits.setInteger("jobId", job.getId()); 
updateHits.executeUpdate(); 

但我的理解是,這繞過數據庫中的樂觀鎖定和我目前SQL服務器遇到問題死鎖,我相信這是罪魁禍首。

有沒有辦法來增加一個字段,而不直接調用和更新,同時保持數據的完整性?

+0

可能想檢查您的鎖是如何創建的。如果你正在爲該更新獲取表鎖,則會出現問題。如果你得到一個行鎖我不明白怎麼回事造成死鎖。 – BlackICE 2011-03-25 11:51:10

+0

我實際上設法解決死鎖問題,只是確保此更新是在事務內運行的最後一條語句。不過,我仍然很想知道更好的解決方案。 – 3urdoch 2011-03-25 12:17:52

+1

您的「逐查詢增量」解決方案比處理悲觀鎖定要好十倍,尤其是在您正在處理多線程和長時間運行的事務時 – kommradHomer 2014-10-28 16:10:25

回答

3

我可以通過簡單地加載 對象,增加值和 但是更新對象如果另一個 線程走來,並在負載和 更新與更新 場則該值將成爲做到這一點 損壞。

如果第二個線程還使用Hibernate,你在使用Hibernate的版本(@版本)的一個線程,承諾第一和改變對象將設置新版本的對象。

當第二個線程提交進來時,hibernate將檢查樂觀鎖定失敗並將拋出異常 - 如果我沒有弄錯StaleObjectException。將圍繞你的併發代碼catch塊你就必須重新加載對象,並嘗試更新,如果它是有道理的機會。如果您使用JPA,則會拋出OptimisticLockException。

有在Hibernate Optimistic Concurrency Control Section信息的負荷。

乾杯!