остаются ли вложенные объектные транзакции атомарными или они работают? - PullRequest
2 голосов
/ 20 марта 2012

У меня есть быстрый вопрос об objectify - это может быть в реальной документации, но я ничего не нашел, поэтому я прошу здесь быть в безопасности.

У меня есть бэкэнд, использующий objectify, что я вродеиз выбежал - что я хотел бы сделать, это следующее - у меня есть план мероприятий, который состоит из мероприятий.В настоящее время, если я удаляю событие, я фактически пишу всю логику, чтобы удалить отдельные действия внутри метода удаления планов событий.

что мне интересно, если я вызываю метод удаления действий из метода удаления планов событий (если он позволяет мне это делать), он атомарный?

образец (это простопсевдокод - не соответствует действительности - имена случаев и методов могут быть неправильными):

// inside event plan dao
public void delete(EventPlan eventPlan) {
  final Objectify ofy = Objectify.beginTransaction();
  try {
    final ActivityDAO activityDao = new ActivityDAO();
    for (final Activity activity : eventPlan.getActivities()) {
      activityDao.delete(activity);
    }
    ofy.getTxn().commit();
  } finally {
    if (ofy.getTxn().isActive()) {
      ofy.getTxn().rollback();
    |
  }
}


// inside activity dao
public void delete(Activity activity) {
  final Objectify ofy = Objectify.beginTransaction();
  try {
    // do some logic in here, delete activity and commit txn
  } finally {
    // check and rollback as normal
  }
}

это безопасно делать?- как сейчас, причина, по которой он так искажен, заключается в том, что я не осознавал проблему группы сущностей - в операции были определенные вещи, которые не входили в ту же группу сущностей, что и сама деятельность - после исправления этого я поместил вселогики в плане событий удалить, и метод становится неуправляемым - нормально ли разбивать материал на более мелкие части или он разбивает атомарность.

спасибо

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Вложенные транзакции не происходят в одном атомарном блоке.В действительности нет такой вещи как вложенная транзакция - все транзакции в вашем примере параллельны, с разными объектами Objectify (DatastoreService).

Ваши внутренние транзакции будут завершены транзакционно.Ваша внешняя транзакция на самом деле ничего не делает.Каждое внутреннее удаление выполняется в своей собственной транзакции - все еще вполне возможно, что первое действие будет успешно удалено, даже если второе действие не удалено.

Если ваша цель состоит в том, чтобы удалить группу объектов полностью илиНичего стиля, посмотрите на использование очередей задач.Вы можете удалить первое действие и поставить задачу в очередь для удаления второй транзакции, так что вы можете быть уверены, что либо действие будет удалено и задание поставлено в очередь, либо ни одно.Затем в задаче вы можете сделать то же самое со вторым и т. Д. Поскольку задачи повторяются, если они терпят неудачу, вы можете управлять поведением, чтобы быть похожим на транзакцию.Остается остерегаться только результатов других запросов, в том числе частично удаленных серий в ходе процесса.

0 голосов
/ 06 августа 2012

Если он удалит внутреннюю транзакцию, внешняя транзакция все равно ничего не сделает?

...