2010-04-09 14 views
11

W jaki sposób CouchDB obsługuje konflikty podczas replikacji dwukierunkowej?Rozstrzygnięcie konfliktu Couchdb

Na przykład: Powiedzmy, że istnieją dwie bazy danych książki adresowej (na serwerze A i B). Jest dokument dla Jacka, który zawiera dane kontaktowe Jacka.

  1. Serwer A i B są replikowane i obie mają tę samą wersję dokumentu Jack.
  2. Na serwerze A numer telefonu komórkowego urządzenia Jack jest aktualizowany.
  3. Na serwerze B adres Jacka jest aktualizowany.
  4. Teraz, gdy wykonujemy replikację dwukierunkową, dochodzi do konfliktu.

Jak działa couchDB? Jeśli zainicjujemy replikację w programie Java, czy istnieje sposób sprawdzenia, czy wystąpiły konflikty w programie java?

Odpowiedz

17

CouchDB wiki posiada szczegółowy explanantion: http://wiki.apache.org/couchdb/Replication_and_conflicts

W skrócie: CouchDB nie próbuje scalić sprzeczne wersje. Obie wersje są kopiowane do obu replik. Algorytm deterministyczny (ale z punktu widzenia aplikacji prawdopodobnie arbitralny) wybiera jedną z nich jako wersję "oficjalną". Wybierze tę samą wersję w obu replikach. Tylko ta wersja będzie widoczna domyślnie i w widokach. Twoja aplikacja może wyszukiwać inne wersje i łączyć je zgodnie ze swoimi potrzebami (prawdopodobnie włączając użytkownika, pokazując wszystkie wersje na ekranie). Jeśli twoja aplikacja nie szuka konfliktów, jedna z tych aktualizacji zostanie utracona.

Jeśli nie korzystasz z interfejsu API do replikacji lub ładowania zbiorczego (ale interfejs API REST dla każdego dokumentu), aktualizacja powodująca konflikt nie zostanie wprowadzona do bazy danych, ale zostanie odrzucona z błędem 409. Musisz scalić przed próbą aktualizacji (tak jak w Subversion).