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

VersionError:Nie znaleziono pasującego dokumentu błędu w Node.js/Mongoose

Na życzenie przedstawiamy zarys naszego problemu i sposobu jego rozwiązania:

W naszym systemie stworzyliśmy niestandardową procedurę blokowania dokumentów (za pomocą funkcji redis-lock), w której następujące zdarzenia miały miejsce w tej dokładnej (nieprawidłowej) kolejności:

NIEPRAWIDŁOWA KOLEJNOŚĆ OPERACJI:

  1. Otrzymano żądanie klienta
  2. Dokument zablokowany
  3. Pobrano dokument
  4. Dokument edytowany
  5. Dokument odblokowany
  6. Żądanie klienta rozwiązane
  7. Dokument zapisany

Gdy zobaczysz to napisane, problem jest oczywisty:zapisywaliśmy nasze dokumenty poza naszą blokadą dokumentów.

Załóżmy, że #6 w naszym systemie zajmuje 100ms. To jest okno 100 ms, w którym jeśli jakiekolwiek inne żądania przechwycą ten sam dokument, będziemy mieli konflikt zapisywania (zatytułowany błąd w tym pytaniu jest w zasadzie konfliktem zapisywania IMHO).

Innymi słowy/przykład:w naszym systemie Request A pobrał dokument X w wersji 1, edytował go, a następnie odblokował, ale zanim Request A zapisał dokument, Request B pochwycił dokument X i zwiększył go do wersji 2 (czytaj na Mongo wersje, aby uzyskać więcej informacji na ten temat). Następnie Request A rozwiązuje swoje żądanie Klienta i przechodzi do zapisania dokumentu X, ale próbuje zapisać wersję 1, a teraz widzi, że ma wersję 2, a więc powyższy błąd.

Więc naprawa jest łatwa. Zapisz swoje dokumenty w swoim zamku. (W powyższym przykładzie przesuń #7 do przed #5. Zobacz poniżej.)

WŁAŚCIWA/STAŁA KOLEJNOŚĆ OPERACJI

  1. Otrzymano żądanie klienta
  2. Dokument zablokowany
  3. Pobrano dokument
  4. Dokument edytowany
  5. Dokument zapisany
  6. Dokument odblokowany
  7. Żądanie klienta rozwiązane

(Możesz argumentować, że #6 i #7 powinny zostać zamienione, ale jest to poza zakresem Mongo/Mongoose/tego pytania.)

Zostawię to pytanie na chwilę bez odpowiedzi i zobaczę, czy ktoś może rzucić trochę światła na lepszy sposób na odizolowanie odpowiedniego kodu i rozwiązanie tego problemu. W naszym przypadku był to bardzo systemowy problem i BARDZO trudny do rozwiązania dla naszego poziomu umiejętności w tym czasie.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak zapewnić unikalny element w tablicy opartej na określonych polach - mongoDB?

  2. Nie można połączyć się z bazą danych Mongo Cloud mongodb w Golang na Ubuntu

  3. Jak zdeserializować obiekt BsonDocument z powrotem do klasy?

  4. Popraw strukturę agregacji MongoDB

  5. Kolekcja zamków Mongodb do momentu ustawienia flagi?