【问题标题】:Google AppEngine: understanding datastore transactionsGoogle AppEngine:了解数据存储事务
【发布时间】:2012-05-22 10:45:46
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您可以只使用 XG 交易(跨组交易) https://developers.google.com/appengine/docs/java/datastore/transactions

    【讨论】:

    • 根据 Google 的文档“实体组关系告诉 App Engine 将多个实体存储在分布式网络的同一部分”。因此,您的建议虽然非常直截了当,但将成为可扩展性杀​​手……
    • 是的,我正在编辑我的答案以添加它并添加一个更好的建议,但它花费的时间比我想象的要长,因为我不确定一些细节。
    • 我想我找到了更好的解决方案:p
    • 这是最好的!像往常一样在文档中错过了这个...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多