Неоднозначность документации транзакций и ConcurrentModificationException - PullRequest
2 голосов
/ 12 марта 2012

Последняя документация здесь http://code.google.com/appengine/docs/java/datastore/transactions.html гласит: «Если ваше приложение получает исключение при отправке транзакции, это не всегда означает, что транзакция завершилась неудачей. Вы можете получить исключения DatastoreTimeoutException, ConcurrentModificationException или DatastoreFailureException в тех случаях, когдатранзакции были зафиксированы и в конечном итоге будут успешно применены. По возможности сделайте свои транзакции хранилища данных идемпотентными, чтобы при повторении транзакции конечный результат был таким же. "

  1. Как это возможнознать, была ли транзакция успешной или нет?
  2. Что я собираюсь делать после перехвата ConcurrentModificationException?Как узнать, нужно ли мне повторить попытку?
  3. Как бы вы порекомендовали сделать, например, платежные транзакции идемпотентно, не зная, была ли она успешной?

1 Ответ

1 голос
/ 12 марта 2012

Несколько замечаний:

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

  2. Просто откат в случае всех исключений.Посмотрите этот пример: http://code.google.com/appengine/docs/java/datastore/transactions.html#Isolation_and_Consistency

  3. Сделайте его идемпотентным - это значит, что если вы вызываете его дважды, это не имеет значения.В случае платежных транзакций вы делаете сущность «платежная транзакция».Для каждой транзакции вы делаете особый объект с данными платежа и записываете его в хранилище данных.Ключевым моментом здесь является создание естественного идентификатора из данных платежа: идентификатор пользователя, исходный счет, сумма платежа, целевой счет, дата / час / минута.Затем, если транзакция повторяется, она создаст объект платежной транзакции с тем же идентификатором и перезапишет старый - что означает, что результат будет таким же, если была выполнена только одна или две транзакции.(Остаток по счету пользователя затем рассчитывается путем прохождения ряда транзакций и добавления его к начальной сумме - это то, что банки фактически делают на практике AFAIK).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...