我最近遇到了这个恼人的问题,因为 GAE 无法在单个事务中处理多个实体组。Java伪代码如下:
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 甚至可以实现上述场景吗?
更新:使用本地 dev GAE 服务器尝试 XG 事务(请参阅下面的答案)时,请记住将以下内容添加到 VM 执行命令(否则它将不起作用):
-Ddatastore.default_high_rep_job_policy_unapplied_job_pct=20