0

我试图了解在 Google AppEngine 数据存储的竞争条件下会发生什么。我一直在使用 Objectify,所以我将在此处使用该符号。

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

现在考虑我有两个试图同时修改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 的结果是什么?

如果我使用了事务,其中一个可运行对象(“失败者”)是否会引发异常?

4

1 回答 1

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

  2. 第二笔交易put()将获得异常。

编辑:

在事务期间您可能会遇到不同的异常,并非所有异常都意味着未(或不会)提交更改。如果合适,您应该实际检查事务和回滚。请参阅第一个示例:http ://code.google.com/appengine/docs/java/datastore/transactions.html

于 2012-01-16T21:39:07.837 回答