私は最近、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