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 elstate
- Comience a realizar una transacción y actualice
state
apending
- 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
valorcanceling
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?