sql >> Database >  >> NoSQL >> MongoDB

CouchDB/Couchbase/MongoDB transactie-emulatie?

Couchdb is standaard transactioneel. Elk document in couchdb bevat een _rev sleutel. Alle updates van een document worden uitgevoerd tegen deze _rev sleutel:-

  1. Verkrijg het document.
  2. Verzend het voor update met de eigenschap _rev.
  3. Als de update slaagt, heeft u de laatste _rev van het document bijgewerkt
  4. Als de update mislukt, was het document niet recent. Herhaal stap 1-3.

Bekijk dit antwoord van MrKurt voor een meer gedetailleerde uitleg.

De couchdb-recepten heeft een bankvoorbeeld dat laat zien hoe transacties worden gedaan in couchdb.

En er is ook deze atomaire bankoverschrijvingen artikel dat transacties in couchdb illustreert.

Hoe dan ook, het gemeenschappelijke thema in al deze links is dat als je het couchdb-patroon volgt van updaten tegen een _rev je mag geen inconsistente staat in je database hebben.

Alle couchdb-documenten zijn uniek sinds de _id velden in twee documenten kunnen niet hetzelfde zijn. Bekijk het bekijk kookboek

Bewerken op basis van opmerking

U kunt in dit geval aparte documenten gebruiken. U voegt een document in, wacht op de succesreactie. Voeg dan nog een document toe, zoals

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

Hiermee kunt u een kaartverkleiningsweergave opzetten die eenvoudig de resultaten van deze documenten telt en heeft u een updateteller. Het enige wat u doet is in plaats van een enkel document bij te werken voor updates, u voegt een nieuw document in om een ​​succesvolle invoeging weer te geven.

Oké, dus ik heb al beschreven hoe je updates kunt doen over afzonderlijke documenten, maar zelfs als je een enkel document bijwerkt, kun je inconsistentie voorkomen als je:

  1. Voeg een nieuw bestand in
  2. Als couchdb een succesbericht geeft -> probeer de teller bij te werken.

Waarom werkt dit?

Dit werkt omdat wanneer u het update document probeert bij te werken, je moet een _rev . opgeven snaar. Je kunt denken aan _rev als een lokale staat voor uw document. Overweeg dit scenario:-

  1. Je hebt het document gelezen dat moet worden bijgewerkt.
  2. Je wijzigt enkele velden.
  3. Ondertussen heeft een ander verzoek het originele document al gewijzigd. Dit betekent dat het document nu een nieuwe _rev . heeft
  4. Maar u verzoekt couchdb om het document bij te werken met een _rev dat is stale die u in stap #1 hebt gelezen.
  5. Couchdb zal een uitzondering genereren.
  6. Je leest het document nog een keer en ontvang de laatste _rev en probeer het bij te werken.

Dus als u dit doet, moet u altijd bijwerken tegen de laatste revisie van het document. Ik hoop dat dit de zaken een beetje duidelijker maakt.

Opmerking:

Zoals opgemerkt door Daniel de _rev regels zijn niet van toepassing op bulkupdates.



  1. MongoDB oplog heeft records met stippen in sleutelnamen, die niet kunnen worden opgevraagd, zeker

  2. Mongoose, zoek, retourneer specifieke eigenschappen

  3. Hoe delen van een hiërarchie (boom) van gegevens in Redis-cache ongeldig te maken?

  4. Hoe $push een veld afhankelijk van een voorwaarde?