Java 具有事务的GAE高复制数据存储(HRD)
我使用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
Transaction tx = pm.currentTransaction();
tx.begin();
pm.makePersistent(object);
tx.commit();
- 然后查询提交的记录,有时返回结果,有时返回null
Query q = pm.newQuery(queryStatement); CompanyProfile result = (CompanyProfile) q.execute();
SJ没有办法绕过它:HRD最终总是一致的: 一种解决方法是使用get而不是查询。Get/put/delete在HRD中是强一致的,而查询最终是一致的:
如果这是一个用户会话中保存后立即查询的场景,您可以手动查询数据并将保存的实体添加到列表中。如果您想使用关系数据库模型,您可能想看看Google Cloud SQL:我自己没有试过,但我的应用程序中没有使用任何事务
我绝对不会使用旧的非人力资源数据存储。如果它在未来一两年内消失,我也不会感到惊讶。它远不如人力资源数据存储可靠。但正如您所发现的,如果您不习惯,最终的一致性可能会很棘手。如果以下查询也在同一事务中完成,它应该会返回正确的结果。然而,所有其他查询最终都是一致的,不幸的是,这是数据存储的本质