Рассмотрим сайт электронной коммерции, где Алиса и Боб редактируют списки продуктов. Алиса улучшает описания, а Боб обновляет цены. Они начинают редактировать Acme Wonder Widget одновременно. Боб заканчивает первым и сохраняет товар по новой цене. Алисе требуется немного больше времени, чтобы обновить описание, и когда она заканчивает, она сохраняет продукт со своим новым описанием. К сожалению, она также перезаписывает цену старой ценой, которая не была предназначена.
По моему опыту, эти проблемы чрезвычайно распространены в веб-приложениях. Некоторое программное обеспечение (например, программное обеспечение Wiki) действительно имеет защиту от этого - обычно второе сохранение завершается неудачно с «страница была обновлена во время редактирования». Но большинство веб-сайтов не имеют этой защиты.
Стоит отметить, что методы контроллера сами по себе являются потокобезопасными. Обычно они используют транзакции базы данных, что делает их безопасными в том смысле, что если Алиса и Боб попытаются сохранить в один и тот же момент, это не приведет к повреждению. Состояние гонки возникает из-за того, что Алиса или Боб имеют устаревшие данные в своем браузере.
Как мы можем предотвратить такие условия гонки? В частности, я хотел бы знать:
- Какие методы можно использовать? например, отслеживание времени последнего изменения. Каковы плюсы и минусы каждого.
- Что такое полезный пользовательский опыт?
- В какие рамки встроена эта защита?