Какой у вас опыт использования If-Match
для реализации оптимистической схемы блокировки в веб-сервисе?
Для упрощения, скажем, мы создаем простую CMS, состоящую исключительно из «страниц», каждая из которых имеет только тело. Если два пользователя начинают редактировать одну и ту же страницу одновременно, то фиксируются только те изменения, которые внесены последним пользователем, сохраненным последним (или, скорее, они перезаписывают изменения, сделанные другим пользователем).
Чтобы предотвратить это, я планирую использовать условные PUT
s, то есть извлечь значение заголовка ответа ETag
и предоставить его в качестве значения заголовка If-Match
в запросе PUT
. Если это значение не совпадает со значением на основе текущего состояния страницы, сервер отклоняет PUT
с 412.
Мне известно об очевидной ловушке, в которой могут возникнуть условия гонки между проверкой предусловия и фактическим обновлением базы данных, но их можно исправить с помощью транзакций и сортировки.
Вы пробовали это на практике? Это плохая идея?