Google app engine Appengine数据存储并发提交

Google app engine Appengine数据存储并发提交,google-app-engine,google-cloud-datastore,objectify,Google App Engine,Google Cloud Datastore,Objectify,我试图在Google AppEngine数据存储中了解比赛期间会发生什么。我一直在使用Objectify,所以我将在这里使用这个符号 @Cached public class Car { @Id public Long id; @Unindexed public String owner = "C"; } 现在考虑我有两个RunNabess,试图同时修改某辆车的所有者/代码>。< /P> Car myCar = ofy.get(Car.class, 10); myCar.own

我试图在Google AppEngine数据存储中了解比赛期间会发生什么。我一直在使用Objectify,所以我将在这里使用这个符号

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

现在考虑我有两个RunNabess,试图同时修改某辆车的<代码>所有者/代码>。< /P>

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”所有尚不确定,但不会报告任何错误。直到写入被持久化到数据存储中,“失败者”才清楚。打印结果会是什么

如果我使用了事务,其中一个Runnable(“失败者”)是否会引发异常

  • 两个实体使用相同的ID(10),因此一个
    put()
    将覆盖另一个。问题是谁先做

  • put()
    的第二个事务将获得异常

  • 编辑:


    在事务处理期间,您可能会遇到不同的异常,但并非所有异常都意味着未提交(或将不提交)更改。您应该实际检查事务并在适当时回滚。请参阅第一个示例:

    为了澄清,第二个事务将获得异常,因此不会覆盖?谢谢,我就是这么想的。有点棘手的测试,所以确认是有帮助的!实际上,第二个事务将获得一个并发修改异常,重试,第二次成功,覆盖该值。如果这是你想要的效果,你需要添加逻辑来避免这种情况。你又给了我一个不完整的答案。Thx;)