Скажем, вы извлекаете набор записей из хранилища данных (что-то вроде: выберите * из MyClass, где зарезервировано = 'false').
как я могу убедиться, что другой пользователь не установил зарезервированное значение по-прежнему false?
Я посмотрел документацию по транзакциям и был шокирован решением Google, которое заключается в том, чтобы перехватить исключение и повторить цикл.
Любое решение, которое мне не хватает - трудно поверить, что в этой среде нет способа выполнить атомарную операцию.
(кстати, я мог бы использовать 'syncronize' внутри сервлета, но я думаю, что это недопустимо, поскольку нет способа гарантировать, что существует только один экземпляр объекта сервлета, не так ли? То же самое относится и к решению статических переменных)
Есть идеи, как решить?
(вот решение Google:
http://code.google.com/appengine/docs/java/datastore/transactions.html#Entity_Groups
посмотрите на:
Key k = KeyFactory.createKey("Employee", "k12345");
Employee e = pm.getObjectById(Employee.class, k);
e.counter += 1;
pm.makePersistent(e);
'Для этого требуется транзакция, поскольку значение может быть обновлено другим пользователем после того, как этот код извлечет объект, но до того, как он сохранит измененный объект. Без транзакции запрос пользователя будет использовать значение счетчика до обновления другого пользователя, а сохранение перезапишет новое значение. При транзакции приложению сообщается об обновлении другого пользователя. Если объект обновляется во время транзакции, транзакция завершается с ошибкой. Приложение может повторить транзакцию, чтобы использовать новые данные
Ужасное решение, не правда ли?