使用Google App Engine数据存储添加实体时的行为不一致

时间:2014-08-17 07:18:16

标签: java google-app-engine google-cloud-datastore

我正在开发一个用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.

为什么会这样?我该如何阻止它发生?

1 个答案:

答案 0 :(得分:4)

您遇到了“最终一致性”的影响,这是使用高复制数据存储区的副作用。基本上,您在数据有时间跨数据中心进行复制之前调用查询。您可以通过使用“Ancestor Queries”来避免这种情况,它始终会导致“非常一致”的查询。建议你read this,它会详细解释。