MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Multi-coleção, multi-documento 'transações' no MongoDB


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 o state
  • Comece a fazer uma transação e atualize o state para pending
  • 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 valor canceling

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?