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íč:-
- Získejte dokument.
- Pošlete jej k aktualizaci pomocí vlastnosti _rev.
- Pokud je aktualizace úspěšná, aktualizovali jste nejnovější _rev dokumentu
- 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:
- Vložit nový soubor
- 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ář:-
- Čtete dokument, který má být aktualizován.
- Změníte některá pole.
- Mezitím jiný požadavek již změnil původní dokument. To znamená, že dokument má nyní nový
_rev
- Požadujete však, aby couchdb aktualizoval dokument pomocí
_rev
to jestale
které jste si přečetli v kroku č. 1. - Couchdb vygeneruje výjimku.
- 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.