2010-04-09 8 views
11

Wie behandelt CouchDB Konflikte während der bidirektionalen Replikation?Couchdb Konfliktlösung

Zum Beispiel: Sagen wir, es gibt zwei Adressbuch-Datenbanken (in Server A und B). Es gibt ein Dokument für Jack, das Kontaktdetails von Jack enthält.

  1. Server A und B werden repliziert und beide haben die gleiche Version von Jack Dokument.
  2. In Server A wird Jacks Handy Nein aktualisiert.
  3. In Server B wird Jacks Adresse aktualisiert.
  4. Jetzt, wenn wir bidirektionale Replikation durchführen, gibt es einen Konflikt.

Wie geht couchDB damit um? Wenn wir die Replikation in einem Java-Programm starten, gibt es eine Möglichkeit zu wissen, ob es irgendwelche Konflikte mit dem Java-Programm gab?

Antwort

17

Das CouchDB Wiki hat eine detaillierte explanantion: http://wiki.apache.org/couchdb/Replication_and_conflicts

Auf den Punkt gebracht: CouchDB nicht versucht, die widersprüchlichen Versionen zu verschmelzen. Beide Versionen werden in beide Repliken kopiert. Ein deterministischer (aber von einem Anwendungsstandpunkt aus möglicherweise willkürlicher) Algorithmus wählt eine von ihnen als die "offizielle" Version aus. Es wird die gleiche Version für beide Replikate auswählen. Nur diese Version wird standardmäßig und in Ansichten angezeigt. Ihre Anwendung kann die anderen Versionen abfragen und sie entsprechend ihren Bedürfnissen zusammenführen (möglicherweise unter Einbeziehung des Benutzers, indem alle Versionen auf dem Bildschirm angezeigt werden). Wenn Ihre Anwendung nicht nach Konflikten sucht, wird eines der beiden Updates effektiv verloren gehen.

Wenn Sie nicht die Replikations- oder Massenlade-API (sondern die REST-API für Dokumente) verwenden, wird das in Konflikt stehende Update nicht in die Datenbank aufgenommen, aber mit einem 409-Fehler zurückgewiesen. Sie müssen zusammenführen, bevor Sie versuchen, erneut zu aktualisieren (genau wie in Subversion).