【发布时间】:2012-05-14 02:56:21
【问题描述】:
我无法找到完全解释从数据存储中删除的实体(我正在使用 JDO deletePersistent)而不处于事务中的文档。当为了性能和避免争用而不使用事务时,我可以承受在并行更新期间失去数据准确性。
但是我如何确保当我的代码同时在不同的机器上运行时,delete 操作不会被以后的 update / put 覆盖之前在另一台机器上对该实体的读取,我让 PersistenceManager 负责对附加对象的隐式更新。
编辑: 在 deletePersistent 之后尝试更新该实体将导致异常,但这是在尝试更新传递给 deletePersistent 的完全相同的副本时。但如果它是另一台机器上的不同副本,将被视为更新已删除的实体(无效)或作为 插入或更新 导致将该实体放回原处?
【问题讨论】:
-
我不知道我是否理解你,但是如果实体被删除了如何更新它?它已经不存在了。
-
在 deletePersistent 之后尝试更新该实体将导致异常,但这与传递给 deletePersistent 的副本完全相同。但如果它是另一台机器上的不同副本,则会被视为更新已删除的实体,因此“它不再存在”。或插入或更新导致该实体返回?
-
这一切都取决于ID。它不应该关心它是否是确切的副本。如果您尝试更新已删除的实体,它应该总是抛出异常。毕竟是短暂的。数据存储对此一无所知。
-
这是我所希望的,但我如何确保这是数据存储行为,我所指的异常实际上是从它自己更改任何字段值,这发生在任何 put 请求实际发送到数据存储之前。
-
如果您尝试写入已删除的实体,数据存储不会引发异常,因为就数据存储而言,更新和插入没有区别。
标签: java google-app-engine google-cloud-datastore