0

我正在使用 Eclipse 在本地计算机上使用 GAE 数据存储。我创建了两个 servlet -AddMovieDeleteMovie

添加电影

Entity movie = new Entity("movie",System.currentTimeMillis());
movie.setProperty("name",     "Hakeshset Beanan");
movie.setProperty("director", "Godard");
datastore.put(movie);

删除电影

Query q = new Query("movie");
PreparedQuery pq = datastore.prepare(q);
List<Entity> movies = Lists.newArrayList(pq.asIterable());
response.put("numMoviesFound", String.valueOf(movies.size()));

for (Entity movie : movies) {
    Key key = movie.getKey();
    datastore.delete(key);
}

有趣的是,DeleteMovie servlet 不会删除所有电影。连续调用返回{"numMoviesFound":"15"},然后{"numMoviesFound":"9"}{"numMoviesFound":"3"}最后{"numMoviesFound":"3"}

为什么不是一次从数据存储中删除所有电影?

更新:问题似乎只发生在本地 Eclipse 上,而不是 GAE 服务器上。

4

1 回答 1

1

我认为您应该在一次事务中删除所有电影,这将确保更好的一致性。

谈到一致性,你的问题就在这里:

Google App Engine 的 High Replication Datastore (HRD) 通过在多个数据中心同步存储数据,为您的读写提供高可用性。但是,从提交写入到它在所有数据中心中可见的延迟意味着跨多个实体组的查询(非祖先查询)只能保证最终一致的结果。因此,此类查询的结果有时可能无法反映基础数据的最新更改。

https://developers.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency

于 2013-04-22T13:54:17.297 回答