MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Emulacja transakcji CouchDB/Couchbase/MongoDB?

Couchdb jest domyślnie transakcyjny. Każdy dokument w couchdb zawiera _rev klucz. Wszystkie aktualizacje dokumentu są wykonywane na podstawie tego _rev klawisz:-

  1. Pobierz dokument.
  2. Wyślij go do aktualizacji za pomocą właściwości _rev.
  3. Jeśli aktualizacja się powiedzie, zaktualizowałeś najnowszą _rewizję dokumentu
  4. 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:

  1. Wstaw nowy plik
  2. 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:-

  1. Przeczytałeś dokument, który ma zostać zaktualizowany.
  2. Zmieniasz niektóre pola.
  3. Tymczasem inny wniosek już zmienił oryginalny dokument. Oznacza to, że dokument ma teraz nowy _rev
  4. Ale Ty prosisz couchdb o aktualizację dokumentu z _rev to jest stale przeczytałeś w kroku 1.
  5. Couchdb wygeneruje wyjątek.
  6. 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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak uzyskać dostęp do MongoDB

  2. Zapytanie Laravel „podobne” z połączeniem MongoDB

  3. usługi warzenia piwa. Nie można uruchomić usługi. get Bootstrap nie powiodło się:5:Błąd wejścia/wyjścia

  4. Utwórz bazę danych w MongoDB

  5. Używanie $push wewnątrz tablicy w manguście