簡體   English   中英

分離的實體已傳遞以保留

[英]Detached entity passed to persist

CacheId aci = new CacheId();
aci.setId(cacheObject.getId());
aci.setSequence(cacheObject.getSequence());
Cache persisted = em.find(Cache.class, aci);
if (persisted == null){
    System.out.println("========== PERSISTING");
    em.persist(cacheObject);
}else{
    System.out.println("========== MERGING");
    em.merge(cacheObject);
}

這意味着在運行我的項目時,另一個實例將刪除具有當前CacheId的條目。 現在我需要做的是將新值設置為具有相同緩存ID的數據庫。 但是,當我執行em.find()時,它不會返回null。 (但是數據庫條目已被刪除。因此,這將最終調用merge。並且合並失敗,並嘗試更新1但更新為0 ...

但是,如果我停止檢查搜索並始終調用持久化,那么我會收到“傳遞給持久化的獨立實體”。 我該如何解決這個問題?

您有並發訪問問題,答案是鎖定 如果您在應用程序中使用開放式鎖定,則只需捕獲Exception並重試(有限次數)。

您還可以通過以下方式使用悲觀鎖定模式:

Cache persisted = em.find(Cache.class, aci, LockModeType.PESSIMISTIC_WRITE);

(或LockModeType.PESSIMISTIC_READ )。 該鎖是立即從數據庫獲取的,也就是說,您將立即知道是否已刪除數據。 並且一旦獲得了鎖,將不允許任何其他事務將其刪除。

唯一剩余的競爭條件是兩個事務嘗試創建相同的數據。

但是請注意:應用程序應盡快提交以釋放鎖,以避免潛在的死鎖或不必要的其他事務阻塞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM