sql >> Base de Datos >  >> NoSQL >> MongoDB

VersionError:No se encontró ningún documento coincidente en Node.js/Mongoose

Por solicitud, aquí hay un resumen de nuestro problema y cómo lo resolvimos:

En nuestro sistema, creamos una rutina de bloqueo de documentos personalizada (usando redis-lock), en la que sucedió lo siguiente en este orden preciso (incorrecto):

ORDEN INCORRECTO DE LAS OPERACIONES:

  1. Solicitud del cliente recibida
  2. Documento bloqueado
  3. Documento recuperado
  4. Documento editado
  5. Documento desbloqueado
  6. Solicitud de cliente resuelta
  7. Documento guardado

Una vez que lo ve escrito, el problema es obvio:estábamos guardando nuestros Documentos fuera de nuestro bloqueo de Documentos.

Supongamos que el #6 toma 100ms en nuestro sistema. Esa es una ventana de 100 ms en la que si alguna otra solicitud toma ese mismo documento, tendremos un conflicto de guardado (el error titulado en esta pregunta es básicamente un conflicto de guardado en mi humilde opinión).

En otras palabras/ejemplo:en nuestro sistema, la Solicitud A tomó la Versión 1 del Documento X, lo editó y luego lo desbloqueó, pero antes de que la Solicitud A guardara el Documento, la Solicitud B tomó el Documento X y lo incrementó a la Versión 2 (leer en Mongo versiones para obtener más información al respecto). Luego, la Solicitud A resuelve su solicitud de Cliente y va a guardar el Documento X, pero está tratando de guardar la Versión 1, y ahora ve que tiene la Versión 2 y, por lo tanto, el error anterior.

Así que la solución es fácil. Guarde sus documentos dentro de su candado. (En el ejemplo anterior, mueva el n.º 7 antes del n.º 5. Consulte a continuación).

ORDEN DE OPERACIONES CORRECTO/FIJO

  1. Solicitud del cliente recibida
  2. Documento bloqueado
  3. Documento recuperado
  4. Documento editado
  5. Documento guardado
  6. Documento desbloqueado
  7. Solicitud de cliente resuelta

(Podría argumentar que el n.° 6 y el n.° 7 deberían intercambiarse, pero eso está fuera del alcance de Mongo/Mongoose/esta pregunta).

Voy a dejar esta pregunta sin responder por un tiempo y ver si alguien puede arrojar algo de luz sobre una mejor manera de aislar el código relevante y solucionar este problema. En nuestro caso, este fue un problema muy sistémico y MUY difícil de solucionar para nuestro nivel de habilidad en ese momento.