Скажите, что вы получаете набор записей из хранилища данных (что-то вроде: select * from MyClass where reserved = 'false').Атомная секция Google App Engine?
Как я могу гарантировать, что другой пользователь не установил зарезервированное значение, все еще является ложным?
Я просмотрел документацию по Транзакции и был шокирован решением Google, которое должно поймать исключение и повторить попытку в цикле.
Любое решение, которое мне не хватает - трудно поверить, что в этой среде нет атомной операции.
(btw - я мог бы использовать «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);
«Это требует сделки, так как значение может быть изменено другим пользователем после того, как этот код выбирает объект, но до того, как он сохранит измененный объект. Без транзакции запрос пользователя будет использовать значение счетчика перед обновлением другого пользователя, а сохранение перезапишет новое значение. С транзакцией заявлению сообщается abo обновление другого пользователя. Если объект обновляется во время транзакции, транзакция завершается с исключением. Приложение может повторить транзакцию для использования новых данных.
Ужасное решение, не так ли?
Нет, это не попало.Общий принцип называется «оптимистичная блокировка», и он более эффективен, чем взаимное исключение («пессимистическая блокировка») в ситуациях, когда утверждение достаточно редко. Это также более удобно для массово распределенных реализаций. –
это ужасно, если у вас много клиентов, которые пытаются зарезервировать комнату одновременно и перед каждым резервом вам нужно выполнить выбор! – bach
не говоря уже о том, что после выбора вы держите ВСЕ незаслуженные номера, поэтому любой другой запрос клиента в это время вызовет исключение ... Механизм блокировки - это не мое изобретение ... это тривиально и необходимо ... – bach