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
comestate
- Inizia a effettuare una transazione e aggiorna lo
state
apending
- 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
valorecanceling
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?