Как запретить одновременное редактирование одного документа несколькими людьми?

Товарищи, есть такая проблема. Допустим, существует редактор документа (текстовый, визуальный, неважно). Редактор раз в 20 секунд сохраняет то, что у него есть в черновик.
На сайте есть авторизация. Доступ одновременно с разных машин на один аккаунт возможен. Авторизация на сайте не означает то, что человек будет находиться в редакторе документа.

Как определить, что документ уже редактируется одним человеком, чтобы второй, случайно открыв тот же документ, не имел возможности его редактировать и не срабатывало автосохранение? А то черновик перетирается одним, потом другим и получается каша.

Я понимаю, что у гугла круто сделано, но там хитрые сервера, совместный доступ и все остальное.
В рамках одного бразуера проблема решаема (если 2 вкладки открыты, к примеру), даже через JS. А вот с разных машин - уже проблема.
Спасибо.
  • Вопрос задан
  • 3207 просмотров
Решения вопроса 1
akubintsev
@akubintsev
Опытный backend разработчик
Это называется словом lock.
Пользователь открыл для редактирования документ - поставили метку locked с user_id и временем доступа.
Другой пользователь потом заходит, видит лок и открыть для записи уже не может.
Можно реализовать множество всяких стратегий по работе с локами, как вам удобно. Можно к примеру дать право насильственно тоже открыть для записи, вопреки локу.
И тогда если этот "вторженец" первым успел сохранить документ - ему меньше головной боли, чем тому, кто позже станет сохранять редактирование.
Конфликт такой проще всего решить через уведомление пользователя о том, что запись уже изменилась другим человеком и показать актуальную версию с датой сохранения в какой-то отдельной форме, не затирая текущую правку.
А можно вообще запретить редактирование, когда висит лок и только администратор сможет его снять, если он висит аномально долго.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
samoilenkoevgeniy
@samoilenkoevgeniy
Lead Full-Stack Web Developer
Я бы в таблице с документами сделал поле "Редактируется" типа boolean,
Когда кто-то открыл документ для редактирования, менял бы флаг с 0 на 1

ну, а дальше, собственно, уже все понятно
Ответ написан
AxisPod
@AxisPod
Хранить поле ревизии. При открытии редактора в скрытом поле сохраняется идентификатор последней ревизии, при сохранении сравнивается, если идентификатор изменился, значит документ изменен. Ну и дальше уже думать что делать, либо разницу показывать, либо еще чего. Примерно так поступает redmine.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы