我之前在数据存储区发布了一个问题:删除事务之外的实体,但没有得到太多运气,也许我在描述问题时太复杂了,所以我会尝试用不同的问题来解决这个问题:
我没有对我的实体使用任何事务,并意识到我可能会因为脏读而丢失提交的更新,并且完全可以接受它(主要是统计数据)。我唯一需要确定的是,如果我在已经进行脏读但没有提交更新之后删除它,它不会写回该实体。我不想通过使用事务来引入争用或性能问题,因为删除很少,更新很多。
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
}
我已经通过在脏读和删除之间在 B 中引入 20 秒睡眠来测试上述情况,它确实将对象写回(实际上这是第一个问题的答案,将更新该问题)。
我可以依靠 memcache 让 Servlet B 在让实体知道 A 即将删除实体之前让我们通过查看从 A 放置的布尔缓存条目“deleting-entity-[KEY]”来说,如果它在那里我不应该读取 servlet B 中的实体,我知道 memcache 不能保证不驱逐数据,但如果它存在,它是否可以从 servlet B 立即访问?
那里有更好的想法吗?