我之前发布了一个问题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
}
我已经通过在脏读和删除之间在B中引入20秒睡眠来测试上述情况,并且它确实将对象写回(实际上这是第一个问题的答案,将更新该问题)。
我是否可以依赖memcache让Servlet B在让实体知道A即将删除实体之前让我们通过查看从A放置的布尔缓存条目'deletion-entity- [KEY]来说明如果它那么我不应该读取servlet B中的实体,我知道memcache并不保证不会驱逐数据,但是如果它存在,它可以立即从servlet B访问?
那里有更好的想法吗?
答案 0 :(得分:0)
在servlet B中使用事务来在写入之前验证实体是否仍在那里。
为什么要避免交易?这就是交易的目的,没有它们,你就不能保证任何数据同步。