Hi рассматривает следующий пример:Обновление с морфием Оптимистическая блокировка
Ресурс:
@PUT
@Path("{id}")
public Response update(@PathParam(value = "id") final String id, final Person person) {
final Person person = service.getPerson(id);
final EntityTag etag = new EntityTag(Integer.toString(person.hashCode()));
// If-Match is required
ResponseBuilder builder = request.evaluatePreconditions(etag);
if (builder != null) {
throw new DataHasChangedException("Person data has changed: " + id);
}
service.updatePerson(id, person.getName());
....
}
Услуги:
public void updatePerson(final String id, final String name) {
final Query<Person> findQuery = morphiaDataStore.createQuery(Person.class).filter("id ==", id);
UpdateOperations<Person> operation = morphiaDataStore.createUpdateOperations(Person.class).set("name", name);
morphiaDataStore.findAndModify(findQuery, operation);
}
лицо:
@Entity("person")
public class Person {
@Id
private ObjectId id;
@Version
private Long version;
private String name;
...
}
Я проверяю, является ли предоставленный etag одним и тем же человеком в базе данных. Однако эта проверка выполняется на самом ресурсе. Я не думаю, что это безопасно, так как обновление происходит после проверки, а другой поток мог бросить проверку тем временем. Как это можно решить правильно? Любой пример или рекомендация приветствуются.