O que posso fazer para evitar conflitos write-gravação em um site de estilo wiki?

StackOverflow https://stackoverflow.com/questions/624186

  •  05-07-2019
  •  | 
  •  

Pergunta

Em um site de estilo wiki, o que posso fazer para prevenir ou mitigar conflitos write-write e ainda permite que o site para executar rapidamente e manter o site fácil de usar?

O problema eu prevejo é a seguinte:

  1. Um usuário começa a editar um arquivo
  2. O usuário B começa a edição do arquivo
  3. acabamentos Usuário A edição do arquivo
  4. acabamentos usuário B editar o arquivo, substituir acidentalmente todas as edições do usuário A

Aqui foram algumas abordagens eu vim com:

  • Tenha algum tipo de check-out / check-in / sistema de bloqueio (embora eu não sei como impedir as pessoas de manter um arquivo check-out "muito longo", e eu não quero que os usuários sejam frustrados por não ser permitido para fazer uma edição)
  • Tenha algum tipo de diff sistema que mostra uma outra alteração feita quando um usuário se compromete as suas alterações e permite algum tipo de merge (mas estou preocupado isto duro para criar e faria o site "muito difícil" para uso)
  • Notificar os usuários de edições simultâneas enquanto que eles estão fazendo suas mudanças (algum tipo de AJAX?)

Qualquer outras maneiras de ir a este? Quaisquer exemplos de sites que implementam este bem?

Foi útil?

Solução

Lembre-se o número da versão (ou ID) da última alteração. Em seguida, ler a entrada antes de escrevê-lo e compará-se esta versão ainda é o mesmo.

No caso de um conflito informar o usuário que estava tentando escrever a entrada que foi entretanto alterados. Apoiá-lo com um diff.

a maioria dos wikis fazê-lo desta forma. MediaWiki , Usemod , etc .

Outras dicas

três vias fusão: A primeira coisa a salientar é que a maioria das edições simultâneas, especialmente em documentos mais longos, estão a diferentes seções do texto. Como resultado, observando que revisão Usuários A e B adquirida, podemos fazer um merge de três vias, conforme detalhado por Bill Ritcher de Guiffy Software . A três vias merge pode identificar onde as edições foram feitas a partir do original, ea menos que eles colidem pode silenciosamente fundir ambas as edições em um novo artigo. Idealmente, neste momento realizar o merge e mostrar o usuário B o novo documento para que ela possa escolher a mais revê-lo.

resolução de colisão: Isso deixa você com o cenário quando ambos os editores ter editado a mesma seção. Neste caso, mesclar tudo o resto e oferecer o texto das três versões para o usuário B - ou seja, incluem o original - com qualquer usuário versão de A na caixa de texto ou Usuário B do. Essa escolha depende se você acha que o padrão deve ser a aceitar a mais recente (o usuário simplesmente clica em Salvar para manter a sua versão) ou forçar o editor para editar duas vezes para obter as suas alterações no (eles têm que voltar a aplicar as suas alterações para o editor A versão da seção).

Usando três vias fusão como isso evita lock-out, que são muito difíceis de lidar bem na web (quanto tempo você deixá-los ter a fechadura?), Eo agravar 'você pode querer olhar de novo' cenário , que só funciona bem para respostas de estilo fórum. Ele também mantém o estilo pós-respondem da web.

Se você quiser Ajax-se um pouco, de forma dinâmica 3-way merge usuário versão de A para a versão do Usuário B enquanto eles estão editando , e notificá-los. Agora que seria impressionante.

No Mediawiki, o servidor aceita a primeira mudança, e, em seguida, quando a segunda edição é salvo uma página conflitos surge, e, em seguida, a segunda pessoa funde as duas alterações em conjunto. Consulte Wikipedia: Ajuda: Editar Conflitos

Usando um mecanismo de bloqueio será, provavelmente, o mais fácil de implementar. Cada artigo pode ter um campo de bloqueio associado com ele e um tempo de bloqueio. Se o tempo de bloqueio ultrapassou algum valor set você consideraria o bloqueio para ser inválido e removê-lo quando se verificar o artigo para edição. Você também pode manter o controle de abrir fechaduras e removê-los na sessão de perto. Também seria necessário para implementar algumas controle de concorrência no banco de dados (data e hora Autogenerated, talvez) para que você possa se certificar de que você está verificando em uma atualização para a versão que você check-out, apenas no caso de duas pessoas foram capazes de editar o artigo ao mesmo tempo. Somente aquele com a versão correta seria capaz com sucesso o check-in uma edição.

Você também pode ser capaz de encontrar um motor de diferença que você pode simplesmente usar para construir diferenças, embora exibindo-os em um editor de wiki pode ser problemático - na verdade, exibindo as diferenças é provavelmente mais difícil do que construir o diff. Você iria contar com o sistema de controle de versão para detectar quando você precisava para rejeitar uma edição e executar um diff.

No Gmail, se estamos a escrever uma resposta a um e-mail e alguém envia uma resposta enquanto ainda está digitando-lo, um pop-up aparece indicando que há uma nova atualização e a atualização em si aparece como outro post sem recarregar a página . Esta abordagem seria atender às suas necessidades e se você pode usar Ajax para mostrar o post exata com um link para diff do que foi apenas atualizada enquanto o usuário B ainda está ocupado digitando sua entrada que seria ótimo.

Como Ravi (e outros) têm dito, você poderia usar uma abordagem AJAX e informar o usuário quando uma outra mudança está em andamento. Quando uma edição é submetido, apenas indicam as diferenças textuais e deixe o segundo trabalho do usuário para fora como para mesclar as duas versões.

No entanto, eu gostaria de acrescentar algo novo você poderia tentar além de que: abrir uma janela de bate-papo entre os editores enquanto eles estão fazendo suas edições. Você poderia usar algo como incorporado Gabbly para que, por exemplo.


A melhor resolução de conflitos é de diálogo direto, eu digo.

Seu problema (update perdido) é resolvido melhor usando Optimistic Controle de concorrência .

Uma implementação é adicionar um versão coluna em cada entidade editável do sistema. Na edição de usuário que você carregar a linha e exibir o formulário html sobre o usuário. Um campo oculto fornece a versão, digamos 3 . As necessidades de consulta atualização para algo parecido com:

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

Se linhas retornadas é 0, então alguém já actualiza o artigo 14. Tudo que você precisa fazer, então, é como lidar com a situação. Algumas soluções comuns:

  1. último commit vitórias
  2. primeira cometer vitórias
  3. merge conflitantes atualizações
  4. deixar o usuário decidir

Em vez de um incremento versão int / long você pode usar um timestamp , mas não é sugerida porque:

recuperar o tempo atual da JVM não é necessariamente seguro em um ambiente em cluster, onde os nós podem não ser tempo sincronizado.

(citação de Java Persistence com Hibernate )

Alguns mais informações no hibernação documentação .

No meu escritório, temos uma política de que todas as tabelas de dados contêm 4 campos:

  • CreatedBy
  • CreatedDate
  • LastUpdateBy
  • LASTUPDATEDATE

Dessa forma, há uma trilha de auditoria agradável em quem fez o quê com os registros, pelo menos, mais recentemente.

Mas o mais importante, torna-se bastante fácil de comparar o LASTUPDATEDATE do registro atual ou editado na tela (requer que você armazená-lo na página, em um cookie, qualquer que seja, com o valor no banco de dados. Se os valores não corresponderem, você pode decidir o que fazer a partir daí.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top