sql >> Databasteknik >  >> NoSQL >> MongoDB

CouchDB/Couchbase/MongoDB transaktionsemulering?

Couchdb är transaktionsbaserat som standard. Varje dokument i couchdb innehåller en _rev nyckel. Alla uppdateringar av ett dokument utförs mot denna _rev nyckel:-

  1. Hämta dokumentet.
  2. Skicka den för uppdatering med egenskapen _rev.
  3. Om uppdateringen lyckas har du uppdaterat den senaste _rev av dokumentet
  4. Om uppdateringen misslyckas var dokumentet inte nyligen. Upprepa steg 1-3.

Kolla in det här svaret av MrKurt för en mer detaljerad förklaring.

couchdb-recepten har ett bankexempel som visar hur transaktioner görs i couchdb.

Och det finns också denna atomic banköverföringar artikel som illustrerar transaktioner i couchdb.

Hur som helst är det gemensamma temat i alla dessa länkar att om du följer couchdb-mönstret att uppdatera mot en _rev du kan inte ha ett inkonsekvent tillstånd i din databas.

Alla couchdb-dokument är unika eftersom _id fält i två dokument kan inte vara samma. Kolla in visa kokboken

Redigera baserat på kommentar

Du kan använda separata dokument i det här fallet. Du infogar ett dokument, väntar på framgångssvaret. Lägg sedan till ett annat dokument som

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

Med detta kan du skapa en kartreduceringsvy som helt enkelt räknar resultaten av dessa dokument och du har en uppdateringsräknare. Allt du gör är att istället för att uppdatera ett enda dokument för uppdateringar infogar du ett nytt dokument för att återspegla en lyckad infogning.

Okej, jag har redan beskrivit hur du kan göra uppdateringar över separata dokument, men även när du uppdaterar ett enda dokument kan du undvika inkonsekvens om du:

  1. Infoga en ny fil
  2. När couchdb ger ett framgångsmeddelande -> försök att uppdatera räknaren.

Varför fungerar detta?

Detta fungerar för att när du försöker uppdatera update document du måste ange en _rev sträng. Du kan tänka på _rev som en lokal stat för ditt dokument. Tänk på det här scenariot:-

  1. Du läser dokumentet som ska uppdateras.
  2. Du ändrar några fält.
  3. En annan begäran har redan ändrat originaldokumentet. Det betyder att dokumentet nu har en ny _rev
  4. Men du ber couchdb att uppdatera dokumentet med en _rev det är stale som du läste i steg #1.
  5. Couchdb genererar ett undantag.
  6. Du läser dokumentet igen och få den senaste _rev och försök att uppdatera den.

Så om du gör detta måste du alltid uppdatera mot den senaste versionen av dokumentet. Jag hoppas att detta gör saken lite tydligare.

Obs!

Som påpekat av Daniel, _rev reglerna gäller inte för massuppdateringar.



  1. Hur kan jag få alla fältnamn i Mongoid-dokumentet?

  2. ImportError:Ingen modul med namnet 'pymongo'

  3. Varför misslyckas Travis med att ansluta använder Redis cache_store när den distribueras till Heroku?

  4. Maskering av PII i MongoDB, Cassandra och Elasticsearch med DarkShield:...