2014-12-03 61 views
0

我有一個簡單的問題。我有一個數據庫表和一些數據和序列號。還有幾個節點指向數據庫。休眠:連續獲取行的最佳方式

我需要每個節點來保證這個節點只有這個節點在當時選擇一個最小序列號的行。

在hibernate中做這件事的最好方法是什麼?

我做的第一件事是用UPGRADE NOWAIT子句執行查詢,然後嘗試更新該行。否則,如果捕獲LockAcquisitionException - 重試它一些超時。

while (retryCount < MAX_RETRY_ATTEMPTS) { 
    try { 
     Object obj = session().get(MyObject.class, stringId, LockMode.UPGRADE_NOWAIT); 
     //Acquire this row somehow 
    } catch (LockAcquisitionException | OptimisticLockException | StaleObjectStateException e) { 
     retryCount = handleException(retryCount, e); 
    } 
} 

但是這樣很容易出錯 - 我應該多少次重試,與間隔? 我寧願找到保證順序鎖定的更好方法。但不知道如何做到這一點。

回答

1

考慮使用LockMode.PESSIMISTIC_FORCE_INCREMENT,並釋放事務提交的鎖定。

+0

問題 - 當我調用session.flush()時會釋放鎖,還是會在它退出@Transactional方法後被釋放? – 2014-12-03 10:13:16

+1

鎖定僅在提交後纔會釋放。 flush()主要用於批處理,不會釋放鎖。 – outdev 2014-12-03 10:16:59