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

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

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

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

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

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽