Как вики обрабатывает несколько одновременных правок? - PullRequest
12 голосов
/ 05 августа 2010

Это всегда задерживалось у меня в голове, поэтому я решил, что с тем же успехом могу спросить.

Как вики обрабатывает несколько изменений одного и того же контента?

Вот упрощенный пример того, что я спрашиваю.Допустим, страница имеет следующий контент:

Я страница!

А теперь давайте скажем, что двое идут, чтобы отредактировать эту страницу.Каждый человек добавляет предложение:

Человек один:

Я страница!Я второе предложение на той же странице!

Лицо два:

Я страница!Я второе предложение!

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

Теперь давайтескажем, что человек один представляет свои изменения раньше, чем человек два, но у человека два даже нет возможности увидеть изменения, внесенные этим человеком.Переписывают ли изменения человека два изменения человека первого, когда он наконец отправляется на отправку?

Существует ли для этого алгоритм сравнения / слияния?

Ответы [ 4 ]

8 голосов
/ 05 августа 2010

Я считаю, что Википедия использует довольно простой алгоритм сравнения / слияния , аналогичный тому, как это делает большинство программ контроля исходного кода.

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

Имейте в виду, однако, что википедия находится на верхнем уровне одновременных пользователеймасштаб.Для большинства вики, вероятно, было бы приемлемо использовать очень простой алгоритм «последнего сохранения выигрыша», когда правки второго человека просто перезаписывают правки первого человека.С добавлением истории, первому человеку будет легко заметить, что их изменения были перезаписаны, и добавить их снова.

Я считаю, что это решение - то, что использует переполнение стека.У SO есть дополнительная функция, в которой Ajax-вызов используется для уведомления редактора, если кто-то другой заходит и изменяет страницу до того, как она закончится.

2 голосов
/ 05 августа 2010

Зависит от вкуса вики. Есть много десятков или сотен клонов вики. Обычно второй пользователь получает сообщение об ошибке «эта страница была отредактирована другим пользователем», а затем он должен перезагрузить страницу и повторить свои правки.

Вики, безусловно, могли бы объединить два редактирования вместе, как это делает система контроля версий, как Subversion. Если вы знакомы с командой UNIX patch, это может потребовать изменения прав пользователя 2 и создания патча, который затем будет применен. Патч может или не может быть успешным; в вашем примере будет конфликт слияния, и поэтому мы вернемся к старому сообщению об ошибке «эта страница была отредактирована другим пользователем, вы теряете».

1 голос
/ 05 августа 2010

Как вики обрабатывает несколько одновременных изменений?

Это зависит от реализации вики.

Существует ли алгоритм сравнения / слияния, которыйможно использовать для этого?

Подойдет любой алгоритм слияния, отвечающий вашим требованиям.

Как правило, это зависит от поведения, которое вам нравится в вики.Например, вы можете решить реализовать свою вики таким образом, чтобы изменение Person Two не было зафиксировано, поскольку статья была изменена, а Person Two работает над устаревшей базовой копией.Потенциально Человек Два вошел бы во что-то совершенно другое, если бы он / она знал об измененияхВ этом случае вы можете отказаться от внесения изменений в лицо Два.Это может быть достигнуто с помощью транзакционного механизма, упомянутого Куртом Дюбуа в своем ответе.

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

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

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

Если вы реализуете вики, у вас есть выбор, как вы хотите, чтобы ваша вики-система работала.

1 голос
/ 05 августа 2010

Может существовать транзакционный механизм, который использует блокировку для предотвращения двойного редактирования файла. См. блокировка файла в Википедии.

...