2010-04-09 18 views
11

In che modo CouchDB gestisce i conflitti mentre si esegue la replica bidirezionale?Risoluzione conflitto Couchdb

Ad esempio: Diciamo che ci sono due database di rubriche (nel server A e B). C'è un documento per Jack che contiene i dettagli di contatto di Jack.

  1. Server A e B sono replicati ed entrambi hanno la stessa versione del documento di Jack.
  2. Nel server A, il numero di cellulare di Jack non viene aggiornato.
  3. Nel server B, l'indirizzo di Jack viene aggiornato.
  4. Ora, quando eseguiamo la replica bidirezionale, c'è un conflitto.

Come si gestisce couchDB? Se iniziamo la replica in un programma Java, c'è un modo per sapere se ci sono stati conflitti dal programma java?

risposta

17

Il wiki CouchDB ha un explanantion dettagliata: http://wiki.apache.org/couchdb/Replication_and_conflicts

In poche parole: CouchDB non cerca di fondere le versioni contrastanti. Entrambe le versioni vengono copiate in entrambe le repliche. Un algoritmo deterministico (ma da un punto di vista dell'applicazione probabilmente arbitrario) sceglie una di esse come versione "ufficiale". Sceglierà la stessa versione su entrambe le repliche. Solo questa versione sarà visibile per impostazione predefinita e nelle visualizzazioni. L'applicazione può richiedere le altre versioni e unirle in base alle proprie esigenze (eventualmente coinvolgendo l'utente mostrando tutte le versioni sullo schermo). Se la tua applicazione non cerca conflitti, uno dei due aggiornamenti verrà effettivamente perso.

Se non si utilizza l'API di caricamento o di caricamento in blocco (ma l'API REST per documento), l'aggiornamento in conflitto non verrà inserito nel database, ma verrà respinto con un errore 409. Devi unire prima di provare ad aggiornare di nuovo (proprio come in Subversion).

Problemi correlati