Appengine datastore одновременные коммиты - PullRequest
0 голосов
/ 17 января 2012

Я пытаюсь понять, что происходит во время гонки в хранилище данных 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?

Если бы я использовал транзакции, один из исполняемых объектов ("проигравший") вызвал бы исключение?

1 Ответ

1 голос
/ 17 января 2012
  1. Оба объекта используют один и тот же идентификатор (10), поэтому один put() перезапишет другой. Это только вопрос, который делает это первым.

  2. Вторая транзакция для put() получит исключение.

Изменить:

Вы можете получить различные исключения во время транзакции, но не все из них означают, что изменение не было (или не будет) зафиксировано. Вы должны проверить транзакцию и выполнить откат, если это необходимо. Смотрите первый пример: http://code.google.com/appengine/docs/java/datastore/transactions.html

...