MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

VersionError:Fehler „Kein passendes Dokument gefunden“ auf Node.js/Mongoose

Auf Anfrage hier ein Überblick über unser Problem und wie wir es gelöst haben:

In unserem System haben wir eine benutzerdefinierte Routine zum Sperren von Dokumenten (unter Verwendung von redis-lock) erstellt, wobei Folgendes in dieser genauen (falschen) Reihenfolge passiert ist:

FALSCHE REIHENFOLGE:

  1. Kundenanfrage erhalten
  2. Dokument gesperrt
  3. Dokument abgerufen
  4. Dokument bearbeitet
  5. Dokument entsperrt
  6. Kundenanfrage gelöst
  7. Dokument gespeichert

Sobald Sie es ausgeschrieben sehen, ist das Problem offensichtlich:Wir haben unsere Dokumente außerhalb unserer Dokumentensperre gespeichert.

Nehmen wir an, Nr. 6 dauert in unserem System 100 ms. Das ist ein 100-ms-Fenster, in dem wir einen Speicherkonflikt haben, wenn andere Anfragen dasselbe Dokument abrufen (der betitelte Fehler in dieser Frage ist meiner Meinung nach im Grunde ein Speicherkonflikt).

Mit anderen Worten/Beispiel:In unserem System hat Anforderung A Version 1 von Dokument X abgerufen, bearbeitet und dann entsperrt, aber bevor Anforderung A das Dokument gespeichert hat, hat Anforderung B Dokument X abgerufen und auf Version 2 erhöht (lesen Sie auf Mongo Versionen für weitere Informationen dazu). Dann löst Anfrage A ihre Client-Anfrage und geht zum Speichern von Dokument X, aber sie versucht, Version 1 zu speichern, und jetzt sieht sie, dass sie Version 2 hat, und daher der obige Fehler.

Die Lösung ist also einfach. Speichern Sie Ihre Dokumente in Ihrem Schloss. (Im obigen Beispiel verschieben Sie #7 vor #5. Siehe unten.)

KORREKTE/FESTE REIHENFOLGE DER ARBEITSWEISE

  1. Kundenanfrage erhalten
  2. Dokument gesperrt
  3. Dokument abgerufen
  4. Dokument bearbeitet
  5. Dokument gespeichert
  6. Dokument entsperrt
  7. Kundenanfrage gelöst

(Sie könnten argumentieren, dass Nr. 6 und Nr. 7 vertauscht werden sollten, aber das würde den Rahmen von Mongo/Mongoose/dieser Frage sprengen.)

Ich werde diese Frage für eine Weile unbeantwortet lassen und sehen, ob jemand etwas Licht ins Dunkel bringen kann, um den relevanten Code besser zu isolieren und dieses Problem zu beheben. In unserem Fall war dies ein sehr systembedingtes Problem, dessen Fehlerbehebung für unser damaliges Qualifikationsniveau SEHR schwierig war.