2013-03-04 54 views
2

更新同一個對象在我的應用程序兩個紗線嘗試在代碼更新相同的實體如下:不同的線程處於休眠

public static <T> T updateEntity(T entity, long id) { 
    long start = System.currentTimeMillis(); 
    EntityManager em = null; 
    EntityTransaction tx = null; 
    try { 
     em = GenericPersistenceManager.emf.createEntityManager(); 
     tx = em.getTransaction(); 
     tx.begin(); 
     entity = em.merge(entity); 
     tx.commit(); 
     LoggerMultiplexer.logDBAccess(start, System.currentTimeMillis(), 
      String.format(OPERATION_UPDATE_ENTITY, entity.getClass().getName(), id)); 
     return entity; 

    } 
    ... 

有時候,我在提交線得到重複鍵錯誤。我想這是在線程嘗試同時更新實體時發生的。可能嗎?我認爲是這樣,因爲如果我將​​添加到上面的函數中,我不會得到重複鍵異常。那麼,我是否必須考慮這種併發問題?如果是這樣,如果我有多個線程試圖更新同一個對象,那麼正確的方法是什麼。

回答

1

在單節點應用程序中,您可以嘗試從SessionPessimistic versioning)中的lock對象從DB中檢索它們時。

更多關於locking。並有關於hibernate concurrency的一些建議。

但也許你應該重新考慮你units of work。添加locking或​​塊會在您的應用程序中添加較高的爭用。當你開發一些transaction basics時最好記住它。縮短物體的使用壽命或減少模式的使用壽命。使用Optimistic versioning(例如,通過添加一個version字段),然後處理併發修改錯誤。

+0

實際上,我嘗試更新的實例對象在應用程序生存時間內存在內存中。不同的服務更新實體的不同字段。當發生更新時,通過上述合併操作將其寫入數據庫。我想我應該看看您提供的鏈接以獲得洞察力,謝謝。 – suat 2013-03-04 22:26:37