sql >> Databáze >  >> NoSQL >> MongoDB

Emulace transakcí CouchDB/Couchbase/MongoDB?

Couchdb je ve výchozím nastavení transakční. Každý dokument v couchdb obsahuje _rev klíč. Všechny aktualizace dokumentu se provádějí proti tomuto _rev klíč:-

  1. Získejte dokument.
  2. Pošlete jej k aktualizaci pomocí vlastnosti _rev.
  3. Pokud je aktualizace úspěšná, aktualizovali jste nejnovější _rev dokumentu
  4. Pokud se aktualizace nezdaří, dokument nebyl aktuální. Opakujte kroky 1–3.

Podívejte se na tuto odpověď od MrKurta pro podrobnější vysvětlení.

recipies couchdb má bankovní příklad, který ukazuje, jak jsou transakce prováděny v couchdb.

A existuje také tento atomový bankovní převod článek, který ilustruje transakce v couchdb.

Společným tématem všech těchto odkazů je každopádně, že pokud budete postupovat podle vzoru couchdb aktualizace proti _rev ve své databázi nemůžete mít nekonzistentní stav.

Všechny dokumenty couchdb jsou jedinečné od _id pole ve dvou dokumentech nemohou být stejná. Podívejte se na zobrazit kuchařku

Upravit na základě komentáře

V tomto případě můžete použít samostatné dokumenty. Vložíte dokument a počkáte na odpověď. Poté přidejte další dokument jako

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

S tím můžete nastavit zobrazení zmenšení mapy, které jednoduše počítá výsledky těchto dokumentů a máte počítadlo aktualizací. Jediné, co děláte, je, že místo aktualizace jednoho dokumentu kvůli aktualizacím vkládáte nový dokument, aby odrážel úspěšné vložení.

Dobře, už jsem popsal, jak můžete provádět aktualizace v samostatných dokumentech, ale i při aktualizaci jednoho dokumentu se můžete vyhnout nekonzistentnosti, pokud:

  1. Vložit nový soubor
  2. Když couchdb zobrazí zprávu o úspěchu -> pokuste se aktualizovat počítadlo.

Proč to funguje?

Funguje to proto, že když se pokusíte aktualizovat update document musíte zadat _rev tětiva. Můžete si představit _rev jako místní stát pro váš dokument. Zvažte tento scénář:-

  1. Čtete dokument, který má být aktualizován.
  2. Změníte některá pole.
  3. Mezitím jiný požadavek již změnil původní dokument. To znamená, že dokument má nyní nový _rev
  4. Požadujete však, aby couchdb aktualizoval dokument pomocí _rev to je stale které jste si přečetli v kroku č. 1.
  5. Couchdb vygeneruje výjimku.
  6. Po přečtení dokumentu znovu získáte nejnovější _rev a pokusit se jej aktualizovat.

Takže pokud to uděláte, budete muset vždy aktualizovat podle nejnovější revize dokumentu. Doufám, že se tím věci trochu vyjasní.

Poznámka:

Jak poukázal Daniel the _rev pravidla se nevztahují na hromadné aktualizace.



  1. jak udělat z proměnné jedinečný klíč v mongoose?

  2. Chyba duplicitního klíče s jedinečným indexem mongodb 2dsphere

  3. MongoDB předem načte dokumenty do paměti RAM pro lepší výkon

  4. Uložte tečkované pole v MongoDB