Google 数据存储 - 如果实体不存在,则祖先查询似乎不高度一致

Google Datastore - ancestor query doesn't appear to be strongly consistent if entity does not exist

假设你有这样的方法:

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。

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

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

我可能是错的,但从你对问题的措辞来看,你似乎混淆了 "strongly consistent" 和 "atomic"。强一致性读取保证反映它之前的所有更新,但在您执行它的那一刻也是陈旧的 - 其他人可能在一微秒后覆盖了数据。

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