Google AppEngine:了解数据存储区事务

时间:2012-05-22 10:45:46

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

我最近遇到了这个恼人的问题,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吗?


使用本地开发GAE服务器尝试XG事务(请参阅下面的答案)时,

更新请记住将以下内容添加到VM执行命令中(否则将无效):

-Ddatastore.default_high_rep_job_policy_unapplied_job_pct=20

1 个答案:

答案 0 :(得分:1)