Как работает пессимистическая блокировка запросов в Rails?

Если пользователь редактирует ресурс с пессимистической блокировкой, никто другой не может редактировать ресурс, пока редактирующий пользователь не сохранит свои изменения. Теперь к моему вопросу: что происходит, когда редактирующий пользователь не сохраняет свои изменения, а нажимает кнопку «Назад» в браузере, чтобы вернуться к последнему просмотру? Ресурс все еще заблокирован или блокировка снята? Тот же вопрос относится к сценарию, в котором редактирующий пользователь находится в режиме редактирования, а затем переходит к другому представлению по ссылкам на панели навигации. Должен ли пользователь вернуться к представлению редактирования определенного ресурса и сохранить изменения, прежде чем блокировка будет снята? И если да, то как можно снять блокировку, если выход из режима редактирования осуществляется с помощью других кнопок, кроме кнопки сохранения?


person Jul    schedule 03.06.2020    source источник


Ответы (1)


Обычная реализация пессимистичных блокировок в Rails, т.е. использование ActiveRecord::Locking::Pessimistic получает блокировку данных во время транзакции базы данных. Таким образом, блокировка получается и снимается во время одного веб-запроса, а не порождается несколькими запросами (например, мастером или многоэтапным процессом в вашем приложении). Это может быть полезно для того, чтобы параллельные запросы, обновляющие одни и те же ресурсы, не приводили к несогласованным данным.

Если вам нужна блокировка для нескольких запросов, вам нужно реализовать это каким-то другим способом, который не зависит от открытой транзакции базы данных.

Чтобы конкретно ответить на ваш вопрос: пессимистическая блокировка не удерживается, пока пользователь редактирует данные в своем браузере. Он получается, когда пользователь отправляет свои изменения на сервер и после этого освобождается. Таким образом, блокировка не затрагивается, если пользователь нажимает кнопку «Назад» или не отправляет никаких изменений, поскольку в этот момент блокировка не удерживается.

person Holger Just    schedule 03.06.2020