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

'Transacciones' de múltiples colecciones y múltiples documentos en MongoDB

Como respuesta genérica, las confirmaciones de varios documentos en MongoDB se pueden realizar como confirmaciones de dos fases, que se han documentado de forma algo extensa en el manual (consulte:http://docs.mongodb.org/manual/tutorial/perform-two-phase- confirma/).

El patrón sugerido por el manual es brevemente el siguiente:

  • Configurar transactions separadas colección, que incluye documento de destino , documento fuente , valor y estado (de la transacción)
  • Crear nuevo objeto de transacción con initial como el state
  • Comience a realizar una transacción y actualice state a pending
  • Aplicar transacciones a ambos documentos (destino, fuente)
  • Actualizar el estado de la transacción a committed
  • Use find para determinar si los documentos reflejan el estado de la transacción, si está bien, actualice el estado de la transacción a done

Además:

  • Debe manejar manualmente los escenarios de falla (algo no sucedió como se describe a continuación)
  • Debe implementar manualmente una reversión, básicamente introduciendo un nombre state valor canceling

Algunas notas específicas para su implementación:

  • No le recomiendo que agregue campos como lock_status , data_old , data_new en documentos de origen/destino. Estas deberían ser propiedades de las transacciones, no los documentos en sí.
  • Para generalizar el concepto de documentos de destino/fuente, creo que podría usar DBref s:http://www.mongodb.org/display/DOCS/Database+References
  • No me gusta la idea de eliminar los documentos de transacción cuando están listos. Estableciendo el estado en done parece una mejor idea ya que esto le permite depurar más tarde y averiguar qué tipo de transacciones se han realizado. Estoy bastante seguro de que tampoco se quedará sin espacio en disco (y para esto también hay soluciones).
  • En su modelo, ¿cómo garantiza que todo haya cambiado como se esperaba? ¿Inspeccionas los cambios de alguna manera?