【问题标题】:Hard deleted object still appears in AppEngine admin console硬删除的对象仍然出现在 AppEngine 管理控制台中
【发布时间】:2012-10-19 16:43:13
【问题描述】:

我在 GAE for Java 上使用 Objectify。最近有一种情况,我使用 ofy().delete() 删除了对象,这应该是硬删除数据存储中的对象。

但是,我仍然能够在 AppEngine 的管理控制台(数据存储查看器)中看到这个硬删除的对象。当我尝试通过单击 ID/名称列来扩展(编辑)此对象时,我收到错误消息“此实体不存在”。我仍然可以使用 ofy().get() 从数据存储中检索此对象。

这是因为索引没有更新吗?

提前致谢!

【问题讨论】:

    标签: java google-app-engine google-cloud-datastore objectify


    【解决方案1】:

    您将看到高复制数据存储中查询的最终一致性。

    这是一个开始阅读的好地方:https://developers.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency

    【讨论】:

    • 那么确保看不到实体的唯一方法是在事务中删除它?那么如果我在该实体上运行 get() 甚至在事务之外我仍然可以看到该值,对吗?
    • Get-by-key 无论您是否在事务中都具有很强的一致性——尽管您可以保证数据存储状态的唯一方法是使用事务。使用 Objectify,您可以使用 Query.hybrid(true),它将您的查询变成仅键查询 + 批量获取。 Ofy 将自动删除出现在查询结果中但实际上不存在的条目。
    • 好的,谢谢。关于最终一致性 - 如果我让 put() - 最终一致,然后在事务内部我在同一个键上调用 get() - 我保证得到我放的东西(我可以保证这个实体没有发生其他写入)?我认为理论上不会。有没有什么实际的界限(时间界限)可以给我一些保证(百分比)?
    • 我想 Query.hybrid(true) 在无法转换为“按键查询”时会引发错误。注意(但与主题相关):objectify 的默认值记录在 ObjectifyService.factory().begin() 中。
    • 在默认模式下,Objectify 处于 STRONG 一致性模式,这意味着任何读取(Query 或 ofy.load().id())都在读取最后一个值,对吧?在 EVENTUAL 一致性模式下,我认为 ofy.load().id() 会读取最后一个值,因为它会在内部创建一个键。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多