Что я могу сделать, чтобы предотвратить конфликты записи и записи на веб-сайте в стиле вики? - PullRequest
9 голосов
/ 08 марта 2009

На веб-сайте в вики-стиле, что я могу сделать, чтобы предотвратить или смягчить конфликты записи-записи , в то же время позволяя сайту работать быстро и обеспечивая простоту использования сайта?

Проблема, которую я предвижу, такова:

  1. Пользователь A начинает редактирование файла
  2. Пользователь B начинает редактирование файла
  3. Пользователь A заканчивает редактирование файла
  4. Пользователь B заканчивает редактирование файла, случайно перезаписывая все правки пользователя A

Вот несколько подходов, которые я придумала:

  • Иметь какую-то систему проверки / регистрации / блокировки (хотя я не знаю, как запретить людям сохранять файл извлеченным «слишком долго», и я не хочу, чтобы пользователи были расстроены не разрешено редактировать)
  • Иметь какую-то diff систему, которая показывает другие изменения, сделанные, когда пользователь фиксирует свои изменения, и допускает какое-то слияние (но я боюсь, что это будет сложно создать и сделает сайт " слишком сложно "использовать)
  • Уведомлять пользователей о параллельных изменениях , пока они вносят свои изменения (что-то вроде AJAX?)

Есть ли другие способы пойти на это? Какие-нибудь примеры сайтов, которые реализуют это хорошо?

Ответы [ 8 ]

17 голосов
/ 08 марта 2009

Запомните номер версии (или ID) последнего изменения. Затем прочитайте запись, прежде чем писать, и сравните, не изменилась ли эта версия.

В случае конфликта сообщите пользователю, который пытался написать запись, которая была изменена за это время. Поддержите его с помощью различий.

Большинство вики делают это так. MediaWiki , Usemod , и т. Д. .

5 голосов
/ 11 марта 2009

Трехстороннее объединение: Первое, на что следует обратить внимание, это то, что большинство одновременных правок, особенно в более длинных документах, относятся к различным разделам текста. В результате, отметив, какие ревизии приобрели пользователи A и B, мы можем выполнить трехстороннее слияние, как описано Биллом Ритчером из Guiffy Software . Трехстороннее объединение может идентифицировать, где изменения были сделаны из оригинала, и, если они не конфликтуют, оно может незаметно объединить оба редактирования в новую статью. В идеале, на этом этапе выполните объединение и покажите Пользователю B новый документ, чтобы он мог выбрать для его дальнейшей доработки.

Разрешение столкновения: Это оставляет вас в сценарии, когда оба редактора редактировали один и тот же раздел. В этом случае объедините все остальное и предложите текст трех версий пользователю B, то есть включите оригинал, с версией пользователя A в текстовом поле или пользователем B. Этот выбор зависит от того, считаете ли вы, что по умолчанию следует принимать последние версии (пользователь просто нажимает кнопку Сохранить, чтобы сохранить свою версию), или заставлять редактора дважды редактировать, чтобы внести свои изменения (они должны повторно применить свои изменения к редактору А). версия раздела).

Такое трехстороннее объединение позволяет избежать блокировок, с которыми очень трудно хорошо справиться в Интернете (как долго вы позволяете им иметь блокировку?), И сценарий обострения «вы, возможно, захотите посмотреть снова» , который хорошо работает только для ответов в стиле форума. Он также сохраняет стиль пост-ответа в сети.

Если вы хотите немного повысить Ajax, динамически 3-стороннее объединение версии пользователя A с версией пользователя B во время ее редактирования и уведомление об этом. Это было бы впечатляюще.

4 голосов
/ 09 марта 2009

В Mediawiki сервер принимает первое изменение, а затем, когда второе редактирование сохраняется, появляется страница конфликтов, а затем второй человек объединяет два изменения вместе. См. Википедия: Справка: Изменить конфликты

1 голос
/ 16 марта 2009

Как сказал Рави (и другие), вы можете использовать подход AJAX и информировать пользователя, когда происходит другое изменение. Когда редактирование отправлено, просто укажите текстовые различия и позвольте второму пользователю решить, как объединить две версии.

Однако я хотел бы добавить кое-что новое, которое вы могли бы попробовать в дополнение к этому: открыть диалог чата между редакторами, пока они вносят свои изменения. Например, вы можете использовать что-то вроде встроенного Gabbly .


Я говорю, что лучшее разрешение конфликтов - это прямой диалог.

1 голос
/ 15 марта 2009

В Gmail, если мы пишем ответ на письмо, а кто-то другой отправляет ответ, пока мы все еще набираем его, появляется всплывающее окно, указывающее, что есть новое обновление, и само обновление отображается как другое сообщение без перезагрузки страницы , Этот подход будет соответствовать вашим потребностям, и если вы можете использовать Ajax, чтобы показать точный пост со ссылкой на diff из того, что было только что обновлено, в то время как пользователь B все еще занят, набирая свою запись, это было бы здорово.

1 голос
/ 08 марта 2009

Использование механизма блокировки, вероятно, будет проще всего реализовать. С каждой статьей может быть связано поле блокировки и время блокировки. Если время блокировки превысило какое-то установленное значение, вы сочтете блокировку недействительной и удалите ее при проверке статьи для редактирования. Вы также можете отслеживать открытые блокировки и удалять их при закрытии сессии. Вам также необходимо реализовать некоторый контроль параллелизма в базе данных (возможно, автоматически сгенерированные временные метки), чтобы вы могли убедиться, что вы проверяете обновление до версии, которую вы извлекли, на тот случай, если два человека смогут редактировать статья в то же время. Только тот, кто имеет правильную версию, сможет успешно проверить изменения.

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

0 голосов
/ 18 марта 2009

В моем офисе действует политика, согласно которой все таблицы данных содержат 4 поля:

  • CreatedBy
  • CreatedDate
  • LastUpdateBy
  • LastUpdateDate

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

Но самое главное, становится достаточно просто сравнить LastUpdateDate текущей или отредактированной записи на экране (требует, чтобы вы сохранили ее на странице, в файле cookie, независимо от значения в базе данных. Если значения не совпадают, вы можете решить, что делать оттуда.

0 голосов
/ 12 марта 2009

Ваша проблема (потерянное обновление) решается лучше всего с помощью Оптимистического управления параллелизмом .

Одной из реализаций является добавление столбца version в каждый редактируемый объект системы. При редактировании пользователя вы загружаете строку и отображаете HTML-форму для пользователя. Скрытое поле дает версию, скажем, 3 . Запрос на обновление должен выглядеть примерно так:

update articles set ..., version=4 where id=14 and version=3;

Если количество возвращенных строк равно 0, тогда кто-то уже обновил статью 14. Все, что вам нужно сделать, - это как справиться с ситуацией. Некоторые общие решения:

  1. выиграл последний коммит
  2. выигрывает первый коммит
  3. объединить конфликтующие обновления
  4. пусть пользователь решит

Вместо возрастающей версии int / long вы можете использовать отметку времени , но это не рекомендуется, потому что:

получение текущего времени из JVM не обязательно безопасно в кластерной среде, где узлы могут не синхронизироваться по времени.

(цитата из Сохранение Java с Hibernate )

Дополнительная информация в документации по спящему режиму .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...