1
我最近遇到了GAE无法在单个事务中处理多个实体组的问题。 Java伪代码如下:Google AppEngine:了解数据存储事务
public void doit(EntityManager em, long id)
{
Customer c = null;
em.getTransaction().begin();
if (id != 0)
c = em.find(Customer.class, id);
boolean create = (c == null);
if (create)
c = new Customer();
c.setName("John Doe");
if (create)
em.persist(c);
em.getTransaction().commit();
}
目的是更新客户数据,如果记录存在,否则创建它。我最终抱怨在事务中有多个实体组。它不允许在一次交易中查找/更新2个不同的客户,因为这些实体属于不同的实体组。
所以这里是我的(一般)问题:
假设我有一个具有余额栏的账户实体的银行应用程序。我希望在交易过程中将资金从一个帐户转移到另一个帐户,以确保没有人在转帐期间更新帐户余额,并且在转帐失败的情况下我需要回滚所有内容。以上场景甚至可以使用GAE吗?
更新:试图XG交易时(见下面的回答)与本地开发GAE服务器记住以下内容添加到虚拟机执行命令(否则将无法正常工作):
-Ddatastore.default_high_rep_job_policy_unapplied_job_pct=20
根据谷歌的文档“实体组关系告诉App Engine的几个实体存储在分布式NE的同一部分twork”。所以,你的建议虽然非常简单,但会是可扩展性杀手... – faraway
Yess,我正在编辑我的答案,并已添加更好的建议,但所花的时间比我想象的要长,因为我不确定关于一些细节。 – bigblind
我想我发现了更好的溶剂:p – bigblind