Java 具有事务的GAE高复制数据存储(HRD)

Java 具有事务的GAE高复制数据存储(HRD),java,google-app-engine,transactions,Java,Google App Engine,Transactions,我使用HRD是因为我希望使用实体组在单个事务中对多个实体进行更改 了解非事务(非祖先)查询可能会看到以前提交的事务的全部、部分或全部结果 我现在面临的问题是: 提交用于向数据库添加新记录的事务后 Transaction tx = pm.currentTransaction(); tx.begin(); pm.makePersistent(object); tx.commit(); 然后查询提交的记录,有时返回结果,有时返回null Query q = pm.newQuer

我使用HRD是因为我希望使用实体组在单个事务中对多个实体进行更改

了解非事务(非祖先)查询可能会看到以前提交的事务的全部、部分或全部结果

我现在面临的问题是: 提交用于向数据库添加新记录的事务后

  Transaction tx = pm.currentTransaction();
  tx.begin();
  pm.makePersistent(object);
  tx.commit();
  • 然后查询提交的记录,有时返回结果,有时返回null

      Query q = pm.newQuery(queryStatement);        
      CompanyProfile result = (CompanyProfile) q.execute();
    
p/s:当关闭HRD时,它工作正常

有解决办法吗

谢谢 Rgds
SJ

没有办法绕过它:HRD最终总是一致的:

一种解决方法是使用get而不是查询。Get/put/delete在HRD中是强一致的,而查询最终是一致的:


如果这是一个用户会话中保存后立即查询的场景,您可以手动查询数据并将保存的实体添加到列表中。

如果您想使用关系数据库模型,您可能想看看Google Cloud SQL:我自己没有试过,但我的应用程序中没有使用任何事务


我绝对不会使用旧的非人力资源数据存储。如果它在未来一两年内消失,我也不会感到惊讶。它远不如人力资源数据存储可靠。但正如您所发现的,如果您不习惯,最终的一致性可能会很棘手。

如果以下查询也在同一事务中完成,它应该会返回正确的结果。然而,所有其他查询最终都是一致的,不幸的是,这是数据存储的本质