一个wiki如何处理多个同时编辑?

15

这个问题一直在我脑海里萦绕着,所以我想我还是问问吧。

维基百科如何处理同一内容的多次编辑?

这里有一个简单的例子。假设一个页面有以下内容:

我是一个页面!

现在假设有两个人要编辑该页面。每个人都添加了一个句子:

第一个人:

我是一个页面!
我是同一页中的第二个句子!

第二个人:

我是一个页面!
我是第二个句子!

想象一下每个人的第二个句子都是关于页面主题的同样相关但不同的事实,每个人都想添加进去。

现在假设第一个人在第二个人之前提交了他的更改,但第二个人甚至没有机会看到第一个人所做的更改。当第二个人最终提交时,他的更改是否会覆盖第一个人的更改?

是否存在某种差异/合并算法可用于此目的?


嘿嘿,并发编程中的数据危险总是很有趣 :) - Razor Storm
4个回答

12
我相信维基百科使用相当简单的diff/merge算法,类似于大多数源代码控制软件所使用的算法。
在你提供的例子中,它会引发合并冲突错误,因为它无法知道哪一行应该先出现在最终的标记中。第二个保存更改的人将被呈现出一个合并错误页面,在那里他们必须选择如何解决冲突。
然而,请记住,维基百科处于并发用户规模的高端。对于大多数wiki来说,使用非常简单的“最后保存获胜”算法可能是可以接受的,其中第二个人的编辑仅覆盖第一个人的编辑。通过历史记录的添加,第一个人应该很容易发现他们的更改已经被覆盖,并重新添加它们。
我相信这也是Stack Overflow所使用的解决方案。SO还具有一个附加功能,即使用Ajax调用通知编辑器,如果有其他人在他们完成之前修改了页面。

1
我的经验与众不同。在我使用的大多数维基百科中,它只是“先保存者胜出”。第二个人必须刷新(通常会丢失更改,除非手动保存),然后重新应用更改。但是,正如您所指出的那样,这确实取决于底层的维基引擎。 - ScottWelker

4
这取决于wiki的类型。有许多种wiki克隆品。通常情况下,第二个用户会收到“此页面已被其他用户编辑”的错误消息,然后他们必须重新加载页面并重新编辑。
一个wiki确实可以像Subversion这样的版本控制系统一样合并这两个编辑。如果您熟悉UNIX的patch命令,它将涉及对用户2的编辑进行差异比较并生成一个补丁,然后应用该补丁。补丁可能成功也可能不成功;在您的示例中,会出现合并冲突,因此会回到旧的“此页面已被其他用户编辑,您失败了”的错误消息。

1

可能存在一种事务机制,它使用锁定来防止文件被编辑两次。请参见维基百科上的文件锁定


1
一个Wiki如何处理多个同时编辑?
这取决于Wiki的实现方式。
是否有可以用于此的差异/合并算法?
任何符合您要求的合并算法都可以。
通常,它取决于您希望Wiki具有的行为。例如,您可以选择以这样的方式实现您的Wiki,即当文章已被修改且Person Two正在使用过时的基本副本时,不会提交Person Two的更改。如果他/她意识到了这些更改,可能会输入完全不同的内容。在这种情况下,您可以选择不允许提交Person Two的更改。这可以通过Kurt Du Bois在他的答案中提到的事务机制来实现。
另一种选择是实现一种始终允许保存Wiki文章的方法。在这种情况下,您可能会失去Person One的更改,而在第一种方法中,您将失去Person Two的更改。
第三种方法是在合并窗口中并排显示两篇文章。我不知道是否有支持此功能的Wiki。如果确实如此,我想知道如果巧合地有三个(或更多)人正在修改同一份文件会发生什么。
因此,如果您正在使用Wiki,请尽量保持编辑小。

如果您正在实现一个Wiki系统,您可以选择您想要的Wiki系统如何运作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接