2016-03-04 27 views
0

我在我的java多線程項目中得到了org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect):Hibernate Row被另一個事務更新或刪除

我正試圖在兩個不同的線程內訪問相同的數據庫記錄。我該如何解決這個問題。這是我有錯誤的方法,

@Override 
@Transactional 
public Gamedetail getByExternalGameIdAndSource(String id, String dataSource) { 
    return (Gamedetail) sessionFactory.getCurrentSession().createCriteria(Gamedetail.class).add(Restrictions.eq("externalgameid", id)) 
      .add(Restrictions.eq("datasource", dataSource)).uniqueResult(); 
} 

我知道hibernate會話不支持多線程。我使用本機SQL查詢,但它給了我類拋出異常。提前感謝。

+0

是一些還是一個線程更新相同的記錄?因爲在讀取記錄時不應該得到'org.hibernate.StaleObjectStateException'。 – Bunti

+0

即使你可以修復它,但數據庫不會允許你同時修改相同的記錄/行 – AntJavaDev

+0

@Bunti兩個線程同時運行,這兩個線程有​​無限循環。所以一個循環正在創建gameDetail對象。如果您沒有找到特定的gameDetail,則此方法將返回null,然後創建一個新的gameDetail記錄並保存它,否則會更新它。其他線程試圖訪問gameDetail並嘗試更新一些字段。 – Neero

回答

0

基於評論我會選擇一個解決方案,你將有一個共享隊列,兩個線程將共享一個線程將保存/更新gameDetail對象到數據庫。該單線程將處理對不存在記錄的更新將簡單地在數據庫中創建一個的情況。您可以同步對此隊列的訪問,也可以使用線程安全併發隊列,例如ConcurrentLinkedQueue

請記住,這種方法可能不會產生更好的性能,因爲兩個線程之間存在爭用以訪問共享隊列。

相關問題