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

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

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

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

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

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

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