MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

CouchDB/Couchbase/MongoDB-Transaktionsemulation?

Couchdb ist standardmäßig transaktional. Jedes Dokument in couchdb enthält einen _rev Schlüssel. Alle Aktualisierungen an einem Dokument werden gegen diese _rev durchgeführt Schlüssel:-

  1. Holen Sie sich das Dokument.
  2. Senden Sie es zur Aktualisierung mit der Eigenschaft _rev.
  3. Wenn die Aktualisierung erfolgreich ist, haben Sie die neueste _rev des Dokuments aktualisiert
  4. Wenn die Aktualisierung fehlschlägt, war das Dokument nicht aktuell. Wiederholen Sie die Schritte 1-3.

Sehen Sie sich diese Antwort von MrKurt für eine ausführlichere Erklärung.

Die Couchdb-Rezepte hat ein Banking-Beispiel, das zeigt, wie Transaktionen in couchdb durchgeführt werden.

Und es gibt auch diese Atombanküberweisungen Artikel, der Transaktionen in couchdb veranschaulicht.

Wie auch immer, das gemeinsame Thema in all diesen Links ist, dass Sie dem Couchdb-Muster der Aktualisierung gegen einen _rev folgen Sie können keinen inkonsistenten Zustand in Ihrer Datenbank haben.

Alle Couchdb-Dokumente sind seit der _id eindeutig Felder in zwei Dokumenten dürfen nicht identisch sein. Sehen Sie sich das Kochbuch ansehen an

Bearbeiten basierend auf Kommentar

In diesem Fall könnten Sie separate Dokumente verwenden. Sie fügen ein Dokument ein, warten auf die Erfolgsmeldung. Fügen Sie dann ein weiteres Dokument wie

hinzu

{_id:'some_id','count':1}

Damit können Sie eine Kartenreduzierungsansicht einrichten, die einfach die Ergebnisse dieser Dokumente zählt, und Sie haben einen Aktualisierungszähler. Alles, was Sie tun, ist, anstatt ein einzelnes Dokument für Aktualisierungen zu aktualisieren, fügen Sie ein neues Dokument ein, um eine erfolgreiche Einfügung widerzuspiegeln.

Okay, ich habe bereits beschrieben, wie Sie Aktualisierungen über separate Dokumente vornehmen können, aber selbst wenn Sie ein einzelnes Dokument aktualisieren, können Sie Inkonsistenzen vermeiden, wenn Sie:

  1. Neue Datei einfügen
  2. Wenn couchdb eine Erfolgsmeldung ausgibt -> versuchen, den Zähler zu aktualisieren.

Warum das funktioniert?

Dies funktioniert, weil, wenn Sie versuchen, das update document zu aktualisieren Sie müssen einen _rev angeben Schnur. Sie können an _rev denken als lokales Bundesland für Ihr Dokument. Betrachten Sie dieses Szenario:-

  1. Sie lesen das zu aktualisierende Dokument.
  2. Sie ändern einige Felder.
  3. In der Zwischenzeit hat eine andere Anfrage bereits das Originaldokument geändert. Das bedeutet, dass das Dokument jetzt einen neuen _rev hat
  4. Aber Sie fordern Couchdb auf, das Dokument mit einem _rev zu aktualisieren das ist stale die Sie in Schritt 1 gelesen haben.
  5. Couchdb generiert eine Ausnahme.
  6. Wenn Sie das Dokument erneut lesen, erhalten Sie die neueste _rev und versuchen Sie, es zu aktualisieren.

Wenn Sie dies tun, müssen Sie also immer gegen die neueste Version des Dokuments aktualisieren. Ich hoffe, das macht die Sache etwas klarer.

Hinweis:

Wie von Daniel hervorgehoben, der _rev Regeln gelten nicht für Massenaktualisierungen.