【问题标题】:datastore: deleting entities outside transactions数据存储:删除事务之外的实体
【发布时间】: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


【解决方案1】:

摘自 GAE 文档:

使用事务

事务是对一个或多个实体的一组数据存储区操作。 每个事务都保证是原子的,这意味着 交易永远不会部分应用。要么所有的操作 在事务中被应用,或者它们都不被应用。

在以下情况下操作可能会失败:

太多用户尝试同时修改实体组。这 应用程序达到资源限制。数据存储区遇到 内部错误。

由于事务保证是原子的,因此像单个删除操作这样的 ATOMIC 操作将始终在事务内部或外部工作。

【讨论】:

  • 这并不一定意味着两个连续的原子动作不能发生;删除然后放
  • @blue 我不认为您可以停止删除然后放置(创建)另一个类似记录。我建议使用版本控制来消除不必要的非最新信息情况.尚未将其与 GAE 一起使用,但在 Hibernate 中可以正常工作。看看这里:“gae-java-persistence.blogspot.com/2009/10/…”
  • thnx DaTroop 寻求反馈,但我刚刚测试了这种情况(为什么之前没有尝试过),在进行脏读后休眠 20 秒,在这 20 秒内我删除了对象,记录已从数据查看器中删除,但在 20 秒过去后立即返回。
【解决方案2】:

答案是肯定的,即使在对象被删除之后,如果之前读取它并且在提交删除后提交更新,它也会被放回,因为正如@Nick Johnson 评论的那样,插入和更新是相同的。测试了在获取对象进行更新后使用 20 秒线程休眠,允许删除对象然后放回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2022-01-23
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多