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



假设你有这样的方法:

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。

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

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

我可能是错的,但从你对问题的措辞来看,听起来你混淆了"强一致性"和"原子"。强一致性读取保证反映之前的所有更新,但在执行它的那一刻也会过时 - 其他人可能会在一微秒后覆盖数据。

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

最新更新