Was kann ich tun Write-Write-Konflikte in einer Wiki-Stil Website zu verhindern?

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

  •  05-07-2019
  •  | 
  •  

Frage

Auf einer Wiki-Stil Website, was kann ich tun, um zu verhindern oder schreib schreiben , während immer noch die Seite so dass schnell und hält die Website läuft einfach zu benutzen?

Das Problem sehe ich, ist dies:

  1. Benutzer A beginnt der Bearbeitung einer Datei
  2. Benutzer B beginnt die Bearbeitung der Datei
  3. Benutzer A beendet die Bearbeitung der Datei
  4. Benutzer B die Datei beendet Bearbeitung versehentlich alle Benutzer A die Änderungen
  5. Überschreiben

Hier wurden einige Ansätze, die ich kam mit:

  • Haben Sie irgendeine Art von Check-out / Check-in / Verriegelungssystem (obwohl ich nicht weiß, wie die Menschen daran zu hindern, eine Datei zu halten ausgecheckt „zu lang“, und ich will nicht die Benutzer von frustriert werden sein nicht erlaubt ein edit)
  • machen
  • Haben Sie irgendeine Art von diff System, das eine andere Änderungen zeigt, wenn ein Benutzer ihre Änderungen verpflichtet und ermöglicht es, eine Art merge (aber ich mache mir Sorgen, das wird schwer zu schaffen und würde die Website „zu hart“ machen zu verwenden)
  • Benachrichtigen der Benutzer über die gleichzeitige Bearbeitung , während sie ihre Änderungen vornehmen (eine Art von AJAX?)

Jede andere Möglichkeiten, dies zu gehen? Alle Beispiele von Websites, die diese auch umzusetzen?

War es hilfreich?

Lösung

Beachten Sie die Versionsnummer (oder ID) der letzten Änderung. Dann den Eintrag lesen, bevor es zu schreiben und vergleichen, wenn diese Version noch das gleiche ist.

Im Fall eines Konflikts informiert den Benutzer, um den Eintrag zu schreiben versucht, die in der Zwischenzeit geändert wurde. Unterstützen Sie ihn mit einem diff.

Die meisten Wikis tun es auf diese Weise. MediaWiki , UseMod , etc .

Andere Tipps

Drei-Wege-Zusammenführung: Die erste Sache ist darauf hinzuweisen, dass die meisten gleichzeitigen Änderungen, vor allem auf längere Dokumenten sind auf verschiedene Abschnitte des Textes. Als Ergebnis mit der Feststellung, welche Revision Benutzer A und B erworben, können wir ein Drei-Wege-Merge tun, wie Bill Ritcher von Guiffy Software . Ein Drei-Wege-Merge kann erkennen, wo die Änderungen wurden von der ursprünglichen gemacht worden, und es sei denn, sie sie kollidieren kann geräuschlos beide Änderungen in einem neuen Artikel verschmelzen. die Zusammenführung und zeigen Benutzer B das neue Dokument an dieser Stelle durchführen Idealerweise so, dass sie weiter können wählen, es zu ändern.

Kollisionsauflösung: Dies lässt Sie mit dem Szenario, wenn beide Editoren den gleichen Abschnitt bearbeitet haben. In diesem Fall verschmelzen alles andere und bieten den Text der drei Versionen von Benutzer B - das heißt, sind die Original - entweder mit Benutzer A-Version in der Textbox oder Benutzer B. Diese Wahl hängt davon ab, ob Sie glauben, der Standard sollte die neuesten (Speicher Benutzer nur Klicks ihre Version behalten) zu akzeptieren oder den Editor zu zwingen, zweimal zu bearbeiten, um ihre Änderungen zu bekommen (sie müssen ihre Änderungen Editor A die neu beantragen Version des Abschnitts).

Mit Drei-Wege wie diese Zusammenführung vermeidet Aussperrung, die sehr schwierig zu handhaben sind gut auf dem Netz (wie lange Sie lassen sie die Sperre haben?) Und die erschwerenden ‚Sie könnten wieder aussehen wollen‘ -Szenario , das funktioniert nur gut für Forum-Stil Antworten. Er behält auch die Post-respond Stil des Web.

Wenn Sie es auf ein wenig Ajax wollen, dynamisch 3-Wege-Merge Benutzer A-Version in User-B-Version , während sie es bearbeiten , und sie benachrichtigen. Nun wäre das eindrucksvoll.

In Mediawiki, übernimmt der Server die erste Änderung, und wenn dann der zweite bearbeiten Konflikte Seite kommt, wird gespeichert und dann die zweite Person führt die beiden Änderungen zusammen. Siehe Wikipedia: Hilfe: Bearbeiten Konflikte

einen Verriegelungsmechanismus verwendet, wird wahrscheinlich am einfachsten zu implementieren. Jeder Artikel kann ein Sperrfeld mit ihm und einer Sperrzeit zugeordnet. Wenn die Sperrzeit etwas eingestellten Wert überschritten würden Sie die Sperre betrachten ungültig zu sein und es entfernen, wenn Sie den Artikel zur Bearbeitung auschecken. Sie könnten auch den Überblick über offene Schleusen halten und sie auf Sitzung schließen entfernen. Sie würden auch einige Nebenläufigkeitssteuerung in der Datenbank implementieren müssen (automatisch generierte Zeitstempel, vielleicht), so dass Sie sicher, dass Sie könnte auf die Version in einem Update werden überprüft, die Sie ausgecheckt, falls zwei Personen konnten die bearbeiten Artikel zur gleichen Zeit. Nur das mit der richtigen Version der Lage sein, erfolgreich in einem Bearbeitungs überprüfen würde.

Sie können auch einen Unterschied Motor der Lage zu finden, die Sie gerade Unterschiede zu konstruieren nutzen könnten, um, obwohl sie in einem Wiki-Editor angezeigt wird problematisch sein kann - tatsächlich die Unterschiede Anzeige ist wahrscheinlich härter als das Diff zu konstruieren. Sie würden auf dem Versionierungssystem verlassen, um zu erkennen, wenn Sie benötigen bearbeiten abzulehnen und ein Diff auszuführen.

In Google Mail, wenn wir eine Antwort auf eine E-Mail und jemand anderes eine Antwort sendet schreiben, während wir noch es eingeben, erscheint ein Popup anzeigt, dass es ein neues Update und das Update selbst erscheint als ein Beitrag ohne Neuladen der Seite . Dieser Ansatz würde Ihre Bedürfnisse anzupassen, und wenn Sie Ajax verwenden können, um die genaue Post mit einem Link zu diff zu zeigen, was gerade aktualisiert, während Benutzer B noch damit beschäftigt ist, seine Eingabe des Eintrags, das wäre toll.

Als Ravi (und andere) gesagt haben, könnten Sie einen AJAX-Ansatz verwenden und den Benutzer darüber informieren, wenn eine andere Änderung im Gange ist. Wenn eine Bearbeitung vorgelegt wird, geben Sie einfach die Textunterschiede und lassen Sie den zweiten Benutzer herausfinden, wie die beiden Versionen zusammenführen.

Allerdings würde Ich mag auf mit etwas Neues hinzuzufügen, die Sie zusätzlich zu dem, versuchen könnten: einen Chat-Dialog zwischen den Editoren öffnen, während sie ihre Bearbeitungen tun. Sie könnte so etwas wie eingebettet Gabbly , dass zum Beispiel verwenden.


Die beste Konfliktlösung direkter Dialog, sage ich.

Ihr Problem (lost update) gelöst besten mit optimistisch Concurrency Control .

Eine Implementierung ist eine Version Spalte in jeder editierbaren Einheit des Systems hinzuzufügen. Benutzer bearbeiten Sie die Zeile laden und das HTML-Formular auf dem Benutzer angezeigt werden soll. Ein verstecktes Feld gibt die Version, sagen wir 3 . Die Update-Abfrage muss in etwa so aussehen:

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

Wenn zurückgegebenen Zeilen 0 sind dann jemand bereits aktualisiert Artikel 14 Alles, was Sie brauchen, dann zu tun ist, wie mit der Situation fertig zu werden. Einige gemeinsame Lösungen:

  1. letzten Commit gewinnt
  2. erste verpflichten gewinnt
  3. fusioniert widersprüchliches Updates
  4. lassen den Benutzer entscheiden

Statt einem Inkrementieren Version int / long können Sie verwenden, um einen Zeitstempel , aber es wird nicht vorgeschlagen, weil:

  

die aktuelle Zeit von der JVM Abrufen ist nicht unbedingt sicher in einer Cluster-Umgebung, wo Knoten können nicht die Zeit synchronisiert werden.

(Zitat von Java Persistence mit Hibernate )

Einige weitere Informationen auf der Hibernate Dokumentation .

In meinem Büro, haben wir eine Politik, die alle Datentabellen enthalten 4 Felder:

  • CreatedBy
  • CreatedDate
  • LastUpdateBy
  • LASTUPDATEDATE

Auf diese Weise gibt es einen schönen Audit-Trail auf, wer was zu den Aufzeichnungen, zumindest zuletzt getan hat.

Aber am wichtigsten ist, wird es leicht genug, um die LASTUPDATEDATE des aktuellen oder bearbeiteten Datensatz auf dem Bildschirm zu vergleichen (erfordert, dass Sie es auf der Seite zu speichern, in einem Cookie, was auch immer, mit dem Wert in der Datenbank. Wenn die Werte nicht übereinstimmen, können Sie entscheiden, was von dort zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top