我无法找到完全解释从数据存储中删除实体的文档(我正在使用JDO deletePersistent),而不是在事务中。在不使用事务时为了提高性能和避免争用,我可以在并行更新期间保证丢失数据的准确性。
但是,我怎样才能确保我的代码在不同的机器上运行,同时删除操作不会被后来的 update / put 覆盖之前在另一台机器上读到该实体,我让PersistenceManager负责对附加对象的隐式更新。
编辑: 尝试在deletePersistent之后更新该实体将导致异常,但这是在尝试更新传递给deletePersistent的完全相同的副本时。但如果它是另一台机器上的另一个副本,则会被视为更新已删除的实体(无效)或插入或更新,从而导致该实体重新投放?
答案 0 :(得分:0)
这取自GAE文件:
使用交易
事务是一个或多个实体上的一组数据存储区操作。 每个事务都保证是原子的,这意味着 交易永远不会部分应用。所有的操作 在交易中应用,或者不应用任何一个。
在以下情况下操作可能会失败:
太多用户尝试同时修改实体组。该 应用程序达到资源限制。数据存储遇到了一个 内部错误。
由于事务保证是原子的,因此像单个删除操作的ATOMIC操作将始终在事务内部或外部工作。
答案 1 :(得分:0)
答案是肯定的,即使在删除对象之后如果之前已经读取并且在提交删除之后提交更新,它将被放回,因为@Nick Johnson评论插入和更新是相同的。测试了在获取更新对象后使用20秒线程休眠,允许删除对象然后被放回。