2012-01-16 16 views
0

Google AppEngineデータストアの競合状態で何が起こるかを理解しようとしています。 Objectifyを使用していますので、ここでその表記法を使用します。Appengineデータストアの同時コミット

@Cached 
public class Car { 
    @Id 
    public Long id; 
    @Unindexed 
    public String owner = "C"; 
} 

は今、私は同時に、特定の車のownerを変更しようと2つのランナブルを持って検討してください。

Car myCar = ofy.get(Car.class, 10); 
myCar.owner = "A"; // Other runnable uses "B" 
ofy.put(myCar); 
System.out.println(ofy.get(Car.class, 10).owner); 

私はカー(10)は「A」または「B」によって「所有」されますが、エラーが報告されていないことになるかどうか、この場合には、その未決定を推定。書き込みがデータストアに保存されるまで、 "敗者"には明らかではありません。印刷物の結果はどうなりますか?

トランザクションを使用していた場合、ランナブルの1つ(「敗者」)が例外を発生させましたか?

答えて

1
  1. どちらのエンティティも同じID(10)を使用するため、一方のput()は他方を上書きします。それは最初にそれを行うのは唯一の質問です。

  2. put()への2回目のトランザクションで例外が発生します。

編集:

あなたは、トランザクション中に別の例外を取得する可能性があります、それらのすべてが、その変化はなかった(あるいはされません)コミットを意味するものではありませ。実際にトランザクションを検査し、必要に応じてロールバックする必要があります。最初の例を参照してください。http://code.google.com/appengine/docs/java/datastore/transactions.html

+0

2番目のトランザクションで例外が発生し、上書きされません。 –

+0

はい、これはトランザクションのポイントです。 –

+0

ありがとう、それは私が考えたものです。確認するのが面倒なので、確認が役立ちます! –

関連する問題