我正在开发一个用Java编写的Google App Engine项目。
每当我将实体添加到数据存储区时,我都会使用一个事务:
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Transaction transaction = datastore.beginTransaction();
datastore.put(entity);
transaction.commit();
然后我计算数据存储区中的实体数量:
Query query = new Query(kind);
query.setFilter(filter);
PreparedQuery preparedQuery = datastore.prepare(query);
int count = preparedQuery.countEntities(FetchOptions.Builder.withDefaults());
System.out.println("count = " + count);
我注意到有时数据存储可能会不一致。就像有时我会添加一个实体,但计数不显示。如果我然后添加另一个实体,则计数增加2.
为什么会这样?我该如何阻止它发生?
答案 0 :(得分:4)
您遇到了“最终一致性”的影响,这是使用高复制数据存储区的副作用。基本上,您在数据有时间跨数据中心进行复制之前调用查询。您可以通过使用“Ancestor Queries”来避免这种情况,它始终会导致“非常一致”的查询。建议你read this,它会详细解释。