MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

'Transazioni' multi-raccolta e multi-documento in MongoDB

Come risposta generica, i commit multi-documento su MongoDB possono essere eseguiti come commit a due fasi, che sono stati ampiamente documentati nel manuale (vedi:http://docs.mongodb.org/manual/tutorial/perform-two-phase- si impegna/).

Lo schema suggerito dal manuale è brevemente il seguente:

  • Imposta transactions separate raccolta, che include documento di destinazione , documento di origine , valore e stato (della transazione)
  • Crea un nuovo oggetto transazione con initial come state
  • Inizia a effettuare una transazione e aggiorna lo state a pending
  • Applica le transazioni a entrambi i documenti (destinazione, origine)
  • Aggiorna lo stato della transazione a committed
  • Utilizza trova per determinare se i documenti riflettono lo stato della transazione, se ok, aggiorna lo stato della transazione su done

Inoltre:

  • Devi gestire manualmente gli scenari di errore (qualcosa non è accaduto come descritto di seguito)
  • Devi implementare manualmente un rollback, fondamentalmente introducendo un nome state valore canceling

Alcune note specifiche per la tua implementazione:

  • Ti sconsiglierei di aggiungere campi come lock_status , data_old , data_new nei documenti di origine/destinazione. Queste dovrebbero essere le proprietà delle transazioni, non i documenti stessi.
  • Per generalizzare il concetto di documenti di destinazione/origine, penso che potresti usare DBref s:http://www.mongodb.org/display/DOCS/Database+References
  • Non mi piace l'idea di eliminare i documenti di transazione quando sono finiti. Impostazione dello stato su done sembra un'idea migliore poiché ciò ti consente di eseguire il debug in seguito e scoprire che tipo di transazioni sono state eseguite. Sono abbastanza sicuro che non rimarrai nemmeno a corto di spazio su disco (e anche per questo ci sono soluzioni).
  • Nel tuo modello come garantisci che tutto sia stato modificato come previsto? Ispeziona le modifiche in qualche modo?