Задать вопрос

Как защититься от ситуаций одновременного редактирования данных разными пользователями?

Есть многопользовательский сайт, где сразу несколько пользователей могут редактировать статьи.

Как защититься от ситуации, когда несколько пользователей (либо один пользователь, но в разных вкладках) открывают редактор одной статьи и случайно перезаписывают сделанные друг другом изменения?
  • Вопрос задан
  • 787 просмотров
Подписаться 3 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 6
Fragster
@Fragster
помогло? отметь решением!
Ввести дополнительное поле "версия", и при записи его увеличивать. Ну а перед записью проверять, чтобы версия совпадала с редактируемой. Это называется "Оптимистическая блокировка".
Ответ написан
Комментировать
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
— Блокировать сущности, когда кто-то открывает редактирование.
— Выводить предупреждение.
— По итогу показывать дифф и инструмент резолва конфликтов.
Ответ написан
Комментировать
Добавить флаг "редактируется". При открытии проверять его и выводить предупреждение, при сохранении снимать. Также можно добавить и id того, кто редактирует.
Ответ написан
Комментировать
@heahoh
Full stackoverflow developer
Ответ написан
Комментировать
alexsandr0000
@alexsandr0000
Программист C#/C++/C
Добавлять признак блокировки записи и чтения. И при редактировании выставлять 1,а при закрытии 0. И желательно это делать атомарно или через двойную блокировку например (почитать можно тут).
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Обычно в таком случае работает самая простая стратегия - кто последний записал, тот и молодец.
Вообще SQL сервер сам разруливает подобные вещи и обычно вам не нужно ничего предпринимать.
Если же захотите все таки предпринимать, то необходимо использовать "ручные" блокировки, но всегда остается риск не снятия блокировки. Часто это хуже, чем использовать стратегию по умолчанию.
Теоретически перед записью можно проверять, не изменилась ли эта запись, если не изменилась, то менять, если изменилась - ошибка. Но делать это надо в одной транзакции.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы