2012-07-25 76 views
0

我以前發佈了一個問題datastore: deleting entities outside transactions,但沒有得到太多的運氣,也許我描述問題太複雜,所以我會嘗試用不同的問題來解決這個問題:數據存儲髒讀取和刪除

我沒有使用任何事務與我的實體,並意識到我可以放棄承諾的更新,因爲髒讀和完全可以與它(主要統計)。我唯一需要確定的是,如果我在已經進行髒讀之後刪除它,但沒有提交更新,它將不會寫回該實體。我不想通過使用事務引入爭用或性能問題,因爲刪除很少,更新很多。

Servlet A 
{ 
    entity = persistenceManager.getObjectById(Entity.class, key) 
    //Stuff 
    persistenceManager.deletePersistent(entity); 
} 


Servlet B 
{ 
    entity = persistenceManager.getObjectById(Entity.class, key) // dirty read made before deletion 

    //Updated some fields, after deletion was commited 
    persistenceManager.flush(); ? the object would be written back 
} 

我已經通過引入20秒測試上面的情況睡在髒讀之間B和刪除以及它寫入對象背部(實際上即對第一個問題的答案,將更新的問題)。

我可以依賴memcache讓Servlet B在獲取實體之前知道A即將刪除實體,讓我們通過查看布爾緩存條目'deleted-entity- [KEY]'從A放入並且if它是在那裏,我不應該讀取servlet B中的實體,我知道memcache不保證不會驅逐數據,但如果它存在,它可以立即從servlet B訪問?

有更好的想法嗎?

+1

幾乎任何以「我可以依賴memcache」開頭的問題的答案是「否」 - 它是一個緩存。正如Dragonx所說,使用事務 - 它們不會引入爭用,除非您已經試圖對實體進行多個並行更新。 – 2012-07-26 05:22:26

回答

0

在寫入之前,使用事務在servlet B中驗證實體是否仍然存在。

爲什麼你要避免交易?這就是交易的目的,如果沒有它們,你不能保證任何數據同步。

+0

試圖避免事務我試圖重新發生同樣的事情,我不得不在最後使用事務,但也改變我的模型的設計,以使分片計數器,以避免爭用。 – blue 2012-07-26 10:36:38