Como uma resposta genérica, commits de vários documentos no MongoDB podem ser executados como commits de duas fases, que foram amplamente documentados no manual (Consulte:http://docs.mongodb.org/manual/tutorial/perform-two-phase- compromete/).
O padrão sugerido pelo manual é brevemente a seguir:
- Configure uma
transactions
separada coleção, que inclui documento de destino , documento de origem , valor e estado (da transação) - Criar novo objeto de transação com
initial
como ostate
- Comece a fazer uma transação e atualize o
state
parapending
- Aplicar transações a ambos os documentos (destino, origem)
- Atualizar o estado da transação para
committed
- Use find para determinar se os documentos refletem o estado da transação, se estiver ok, atualize o estado da transação para
done
Além disso:
- Você precisa lidar manualmente com cenários de falha (algo não aconteceu conforme descrito abaixo)
- Você precisa implementar manualmente uma reversão, basicamente introduzindo um nome
state
valorcanceling
Algumas notas específicas para sua implementação:
- Eu desencorajaria você a adicionar campos como
lock_status
,data_old
,data_new
em documentos de origem/destino. Estas devem ser propriedades das transações, não dos documentos em si. - Para generalizar o conceito de documentos de destino/fonte, acho que você pode usar
DBref
s:http://www.mongodb.org/display/DOCS/Database+References - Não gosto da ideia de excluir documentos de transação quando eles são concluídos. Configurando o estado para
done
parece ser uma idéia melhor, pois isso permite que você depure posteriormente e descubra que tipo de transações foram realizadas. Tenho certeza de que você também não ficará sem espaço em disco (e para isso também existem soluções). - No seu modelo, como você garante que tudo foi alterado conforme o esperado? Você inspeciona as alterações de alguma forma?