sql >> Databáze >  >> NoSQL >> MongoDB

VersionError:Na Node.js/Mongoose nebyla nalezena žádná chyba odpovídající dokumentu

Na požádání zde je nástin našeho problému a způsob, jak jsme jej vyřešili:

V našem systému jsme vytvořili vlastní rutinu zamykání dokumentů (pomocí redis-locku), přičemž následující nastalo v tomto přesném (nesprávném) pořadí:

NESPRÁVNÉ POŘADÍ OPERACÍ:

  1. Požadavek klienta přijat
  2. Dokument je uzamčen
  3. Dokument byl načten
  4. Dokument upraven
  5. Dokument odemčen
  6. Požadavek klienta vyřešen
  7. Dokument byl uložen

Jakmile to uvidíte napsané, problém je zřejmý:ukládali jsme naše dokumenty mimo zámek dokumentů.

Předpokládejme, že #6 trvá v našem systému 100 ms. To je 100 ms okno, ve kterém pokud jakýkoli jiný požadavek zachytí stejný dokument, dojde ke konfliktu při ukládání (chyba s názvem v této otázce je v podstatě IMHO konflikt při ukládání).

Jinými slovy/příklad:v našem systému žádost A převzala verzi 1 dokumentu X, upravila ji a pak odemkla, ale než žádost A dokument uložila, žádost B uchopil dokument X a zvýšil jej na verzi 2 (přečtěte si na Mongo verze pro více informací). Poté požadavek A vyřeší svůj požadavek klienta a přejde k uložení dokumentu X, ale pokouší se uložit verzi 1 a nyní vidí, že má verzi 2, a tedy chybu výše.

Takže oprava je snadná. Uložte své dokumenty do zámku. (Ve výše uvedeném příkladu přesuňte #7 před #5. Viz níže.)

SPRÁVNÉ/Pevné POŘADÍ OPERACÍ

  1. Požadavek klienta přijat
  2. Dokument je uzamčen
  3. Dokument byl načten
  4. Dokument upraven
  5. Dokument byl uložen
  6. Dokument odemčen
  7. Požadavek klienta vyřešen

(Mohli byste argumentovat, že #6 a #7 by se měly zaměnit, ale to je mimo rozsah Mongo/Mongoose/tato otázka.)

Nechám tuto otázku na chvíli bez odpovědi a uvidíme, jestli někdo může vrhnout nějaké světlo na lepší způsob, jak izolovat příslušný kód a vyřešit tento problém. V našem případě to byl velmi systémový problém a VELMI náročné na řešení pro naši tehdejší úroveň dovedností.



  1. Existují nějaké nástroje pro odhad velikosti indexu v MongoDB?

  2. Základy nasazení sady replik MongoDB a fragmentů pomocí Puppet

  3. mongoengine - Dotaz na ListField EmbeddedDocumentField

  4. Důvody pro a proti přesunu z SQL serveru na MongoDB