0

GoogleAppEngineデータストアの競合状態で何が起こるかを理解しようとしています。私はObjectifyを使用しているので、ここではその表記を使用します。

@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);

この場合、Car(10)が「A」または「B」のどちらによって「所有」されるかは不明であると推測されますが、エラーは報告されません。書き込みがデータストアに永続化されるまで、「敗者」には明らかではありません。printlnsの結果はどうなりますか?

トランザクションを使用した場合、実行可能ファイルの1つ(「敗者」)が例外を発生させたでしょうか?

4

1 に答える 1

1
  1. 両方のエンティティが同じID(10)を使用するため、一方が他方put()を上書きします。それを最初に行うのは問題だけです。

  2. の2番目のトランザクションput()は例外を取得します。

編集:

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

于 2012-01-16T21:39:07.837 に答える