MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

VersionError:Няма намерен съответстващ документ грешка в Node.js/Mongoose

По заявка ето описание на нашия проблем и как го разрешихме:

В нашата система създадохме персонализирана рутина за заключване на документи (използвайки redis-lock), при която следното се случи в този точен (неправилен) ред:

НЕПРАВИЛЕН РЕД НА ОПЕРАЦИИ:

  1. Получена е клиентска заявка
  2. Документът е заключен
  3. Документът е извлечен
  4. Документът е редактиран
  5. Документът е отключен
  6. Заявката на клиента е разрешена
  7. Документът е запазен

След като го видите написано, проблемът е очевиден:ние записвахме нашите документи извън нашия документ за заключване.

Да приемем, че #6 отнема 100 мс в нашата система. Това е прозорец от 100 ms, в който ако други заявки грабнат същия документ, ще имаме конфликт при запазване (заглавената грешка в този въпрос е основно конфликт на запазване IMHO).

С други думи/пример:в нашата система, Заявка A грабна версия 1 на Документ X, редактира я, след това я отключи, но преди Заявка A да запази документа, Заявка B грабна Документ X и го увеличи до Версия 2 (прочетете на Mongo версии за повече информация за това). След това Заявка A разрешава своята клиентска заявка и отива да запази документ X, но се опитва да запази версия 1 и сега вижда, че има версия 2, и по този начин грешката по-горе.

Така че поправката е лесна. Запазете вашите документи в ключалката си. (В горния пример преместете #7 преди #5. Вижте по-долу.)

ТОЧЕН/ФИКСИРАН РЕД НА ОПЕРАЦИИ

  1. Получена е клиентска заявка
  2. Документът е заключен
  3. Документът е извлечен
  4. Документът е редактиран
  5. Документът е запазен
  6. Документът е отключен
  7. Заявката на клиента е разрешена

(Бихте могли да аргументирате, че #6 и #7 трябва да бъдат разменени, но това е извън обхвата на Mongo/Mongoose/този въпрос.)

Ще оставя този въпрос без отговор за известно време и ще видя дали някой може да хвърли малко светлина върху по-добър начин за изолиране на съответния код и отстраняване на този проблем. В нашия случай това беше много системен проблем и МНОГО предизвикателство за отстраняване на неизправности за нашето ниво на умения по това време.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $min

  2. MongoDB:Възможно ли е да се направи заявка, независимо от главните букви?

  3. Урокът за основите на MongoDB

  4. Извличане на стойност от MongoDB по нейното ключово име

  5. Случаи на използване за NoSQL