【问题标题】:Google Datastore - ancestor query doesn't appear to be strongly consistent if entity does not existGoogle Datastore - 如果实体不存在,祖先查询似乎不是强一致的
【发布时间】:2020-01-16 02:10:32
【问题描述】:

假设你有这样一个方法:

Entity entity = ofy().load().type(Entity.class)
        .ancestor(key)
        .filter("someField", someValue)
        .first().now();

if (entity == null) {
    // Entity does not exist yet.
    // Write new entity to Datastore.
}

该方法通过祖先查询检查某个实体是否存在。如果没有,则将其写入数据存储区。

我发现的一件事是,如果上述方法同时执行两次,那么会写入两个实体。由于竞争条件,entity 似乎仍被视为 null。

我认为祖先查询应该是强一致的,从而防止上述情况发生?当实体不存在时,它似乎不是强一致的。

有没有办法防止在上述情况下写入两个实体?

【问题讨论】:

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


    【解决方案1】:

    我可能是错的,但从您提出问题的方式来看,听起来您将“强烈一致”与“原子”混淆了。高度一致的读取可以保证反映之前的所有更新,但在您执行它的那一刻也是陈旧的 - 其他人可能会在一微秒后覆盖数据。

    防止数据存储中出现竞争条件的唯一方法是使用事务。网上有相当多的文档,所以我不会在这里赘述。

    【讨论】:

    • 我想我的意思也是原子的。事务中的祖先查询是防止竞争条件和保持原子性的一种方式吗?
    • 在事务中,您只能发出 get-by-key 和祖先查询。所以基本上,是的。但交易是必不可少的元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2020-05-04
    • 2023-03-03
    相关资源
    最近更新 更多