Спасибо за ваш ответ.
Жаль, что реализация makePersistence () предназначена для записи целого объекта в хранилище данных, а не только в поля, которые были изменены.
Этот факт фактически заставляет ЛЮБОЕ обновление общего объекта в GAE использовать транзакцию как правило.
Более того - в таких случаях вы должны реализовать «механизм повторных попыток», поскольку в транзакции может возникнуть исключение.
Итак ... обновление любого общего объекта в GAE должно ВСЕГДА иметь эти дополнения:
- сделать это в рамках транзакции
- реализовать механизм повтора
Большинство примеров Google на своем сайте фактически не учитывают это. Как будто они предполагают, что большинство приложений не будут использовать общие объекты
Например (http://code.google.com/appengine/docs/java/datastore/creatinggettinganddeletingdata.html):
public void updateEmployeeTitle(User user, String newTitle) {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
Employee e = pm.getObjectById(Employee.class, user.getEmail());
if (titleChangeIsAuthorized(e, newTitle) {
e.setTitle(newTitle);
} else {
throw new UnauthorizedTitleChangeException(e, newTitle);
}
} finally {
pm.close();
}
}
OR
public void updateEmployeeTitle(Employee e, String newTitle) {
if (titleChangeIsAuthorized(e, newTitle) {
e.setTitle(newTitle);
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.makePersistent(e);
} finally {
pm.close();
}
} else {
throw new UnauthorizedTitleChangeException(e, newTitle);
}
}