1

私は最近、GAEが1つのトランザクションで複数のエンティティグループを処理できないというこの厄介な問題に直面しました。以下の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();  
}  

目的は、レコードが存在する場合は顧客データを更新し、存在しない場合は作成することでした。トランザクション内の複数のエンティティグループについて不平を言う例外が発生しました。これらのエンティティは異なるエンティティグループに属しているため、1つのトランザクションで2つの異なる顧客を検索/更新することはできません。
これが私の(一般的な)質問です
。残高フィールドを持つアカウントエンティティを持つ銀行アプリケーションがあるとします。もちろん、トランザクション内で1つのアカウントから別のアカウントに送金したいので、送金中に両方のアカウントの残高が更新されないようにします。送金が失敗した場合は、すべてをロールバックする必要があります。上記のシナリオはGAEでも可能ですか?


更新:ローカル開発GAEサーバーでXGトランザクション(以下の回答を参照)を試す場合は、VM実行コマンドに次を追加することを忘れないでください(そうでない場合は機能しません)。

-Ddatastore.default_high_rep_job_policy_unapplied_job_pct=20
4

1 に答える 1

1

XGトランザクション(グループ間トランザクション)を使用でき ますhttps://developers.google.com/appengine/docs/java/datastore/transactions

于 2012-05-22T11:33:54.853 に答える