Couchdb jest domyślnie transakcyjny. Każdy dokument w couchdb zawiera _rev
klucz. Wszystkie aktualizacje dokumentu są wykonywane na podstawie tego _rev
klawisz:-
- Pobierz dokument.
- Wyślij go do aktualizacji za pomocą właściwości _rev.
- Jeśli aktualizacja się powiedzie, zaktualizowałeś najnowszą _rewizję dokumentu
- Jeśli aktualizacja się nie powiedzie, dokument nie był aktualny. Powtórz kroki 1-3.
Sprawdź tę odpowiedź MrKurta dla bardziej szczegółowego wyjaśnienia.
przepisy couchdb ma przykład bankowy, który pokazuje, jak transakcje są wykonywane w couchdb.
I jest też ten atomic przelewy bankowe artykuł ilustrujący transakcje w couchdb.
W każdym razie wspólnym motywem wszystkich tych linków jest to, że jeśli podążasz za wzorcem couchdb aktualizacji względem _rev
nie możesz mieć niespójnego stanu w swojej bazie danych.
Wszystkie dokumenty couchdb są unikalne, ponieważ _id
pola w dwóch dokumentach nie mogą być takie same. Zapoznaj się z wyświetl książkę kucharską
Edytuj na podstawie komentarza
W tym przypadku możesz użyć oddzielnych dokumentów. Wstawiasz dokument, czekasz na odpowiedź sukcesu. Następnie dodaj kolejny dokument, taki jak
{_id:'some_id','count':1}
Dzięki temu możesz skonfigurować widok zmniejszania mapy, który po prostu zlicza wyniki tych dokumentów i masz licznik aktualizacji. Wszystko, co robisz, to zamiast aktualizować pojedynczy dokument w celu aktualizacji, wstawiasz nowy dokument, aby odzwierciedlić udane wstawienie.
Okej, więc już opisałem, jak możesz aktualizować oddzielne dokumenty, ale nawet podczas aktualizowania pojedynczego dokumentu możesz uniknąć niespójności, jeśli:
- Wstaw nowy plik
- Gdy couchdb wyświetli komunikat o powodzeniu -> spróbuj zaktualizować licznik.
Dlaczego to działa?
To działa, ponieważ gdy próbujesz zaktualizować update document
musisz podać _rev
strunowy. Możesz pomyśleć o _rev
jako stan lokalny dla twojego dokumentu. Rozważ ten scenariusz:-
- Przeczytałeś dokument, który ma zostać zaktualizowany.
- Zmieniasz niektóre pola.
- Tymczasem inny wniosek już zmienił oryginalny dokument. Oznacza to, że dokument ma teraz nowy
_rev
- Ale Ty prosisz couchdb o aktualizację dokumentu z
_rev
to jeststale
przeczytałeś w kroku 1. - Couchdb wygeneruje wyjątek.
- Przeczytałeś dokument ponownie, pobierz najnowszą wersję
_rev
i spróbuj go zaktualizować.
Więc jeśli to zrobisz, zawsze będziesz musiał aktualizować o najnowszą wersję dokumentu. Mam nadzieję, że dzięki temu wszystko stanie się jaśniejsze.
Uwaga:
Jak zauważył Daniel _rev
reguły nie dotyczą aktualizacji zbiorczych.