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"。强一致性读取保证反映它之前的所有更新,但在您执行它的那一刻也是陈旧的 - 其他人可能在一微秒后覆盖了数据。
防止数据存储中的竞争条件的唯一方法是使用事务。网上有相当多的文档,所以我不会在这里赘述。
假设你有这样的方法:
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"。强一致性读取保证反映它之前的所有更新,但在您执行它的那一刻也是陈旧的 - 其他人可能在一微秒后覆盖了数据。
防止数据存储中的竞争条件的唯一方法是使用事务。网上有相当多的文档,所以我不会在这里赘述。