Appengine数据存储并发提交

时间:2012-01-16 21:22:49

标签: google-app-engine google-cloud-datastore objectify

我正在尝试了解Google AppEngine数据存储区在竞争条件下会发生什么。我一直在使用Objectify,所以我会在这里使用这种表示法。

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

现在考虑我有两个runnables试图同时修改特定汽车的owner

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的结果是什么?

如果我使用了交易,那么其中一个runnables(" loser")是否会引发异常?

1 个答案:

答案 0 :(得分:1)

  1. 两个实体使用相同的ID(10),因此一个put()将覆盖另一个。这只是首先要做的问题。

  2. put()的第二个交易将获得例外。

  3. 修改

    您可能在交易期间获得不同的例外,并非所有例外都意味着未提交(或不会)提交更改。实际上,您应该检查事务并在适当的情况下回滚。请参阅第一个示例:http://code.google.com/appengine/docs/java/datastore/transactions.html