我以前發佈了一個問題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訪問?
有更好的想法嗎?
幾乎任何以「我可以依賴memcache」開頭的問題的答案是「否」 - 它是一個緩存。正如Dragonx所說,使用事務 - 它們不會引入爭用,除非您已經試圖對實體進行多個並行更新。 – 2012-07-26 05:22:26