【问题标题】:Appengine datastore concurrent commitsAppengine 数据存储并发提交
【发布时间】:2012-01-16 21:22:49
【问题描述】:

我试图了解在 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 的结果是什么?

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

【问题讨论】:

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


    【解决方案1】:
    1. 两个实体使用相同的 ID (10),因此一个 put() 将覆盖另一个。只是先做的问题。

    2. put() 的第二个事务会得到异常。

    编辑:

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

    【讨论】:

    • 明确一点,第二个事务会得到异常,因此不会被覆盖?
    • 谢谢,我就是这么想的。测试有点棘手,所以确认很有帮助!
    • 其实第二次事务会得到并发修改异常,重试,第二次成功,覆盖值。如果这是您想要的效果,您需要添加逻辑以避免这种情况。
    • 你又给我一个不完整的答案。谢谢 ;)
    猜你喜欢
    • 2020-05-10
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多