MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Emulazione transazione CouchDB/Couchbase/MongoDB?

Couchdb è transazionale per impostazione predefinita. Ogni documento in couchdb contiene un _rev chiave. Tutti gli aggiornamenti di un documento vengono eseguiti in base a questo _rev chiave:-

  1. Ottieni il documento.
  2. Invialo per l'aggiornamento utilizzando la proprietà _rev.
  3. Se l'aggiornamento riesce, hai aggiornato l'ultima _rev del documento
  4. Se l'aggiornamento non riesce il documento non è recente. Ripetere i passaggi 1-3.

Dai un'occhiata a questa risposta di MrKurt per una spiegazione più dettagliata.

Le ricette couchdb ha un esempio bancario che mostra come vengono eseguite le transazioni in couchdb.

E c'è anche questo bonifici bancari atomici articolo che illustra le transazioni in couchdb.

Comunque il tema comune in tutti questi link è che se segui il pattern couchdb di aggiornamento rispetto a un _rev non puoi avere uno stato incoerente nel tuo database.

Tutti i documenti couchdb sono unici a partire da _id i campi in due documenti non possono essere gli stessi. Dai un'occhiata al visualizza il ricettario

Modifica in base al commento

In questo caso potresti usare documenti separati. Inserisci un documento, attendi la risposta di successo. Quindi aggiungi un altro documento come

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

Con questo puoi impostare una visualizzazione ridotta della mappa che conta semplicemente i risultati di questi documenti e hai un contatore di aggiornamento. Tutto quello che stai facendo è invece di aggiornare un singolo documento per gli aggiornamenti, stai inserendo un nuovo documento per riflettere un inserimento riuscito.

Va bene, quindi ho già descritto come eseguire aggiornamenti su documenti separati, ma anche quando aggiorni un singolo documento puoi evitare incoerenze se :

  1. Inserisci un nuovo file
  2. Quando couchdb dà un messaggio di successo -> tenta di aggiornare il contatore.

Perché funziona?

Questo funziona perché quando provi ad aggiornare il update document devi fornire un _rev corda. Puoi pensare a _rev come stato locale per il tuo documento. Considera questo scenario:-

  1. Leggi il documento che deve essere aggiornato.
  2. Hai cambiato alcuni campi.
  3. Nel frattempo un'altra richiesta ha già modificato il documento originale. Ciò significa che il documento ora ha un nuovo _rev
  4. Ma tu richiedi a couchdb di aggiornare il documento con un _rev cioè stale che hai letto nel passaggio n. 1.
  5. Couchdb genererà un'eccezione.
  6. Leggi di nuovo il documento e ottieni l'ultimo _rev e prova ad aggiornarlo.

Quindi, se lo fai, dovrai sempre aggiornare l'ultima revisione del documento. Spero che questo renda le cose un po' più chiare.

Nota:

Come sottolineato da Daniel il _rev le regole non si applicano agli aggiornamenti in blocco.