Som ett generiskt svar kan multi-document commits på MongoDB utföras som tvåfas commits, som har dokumenterats något utförligt i manualen (se:http://docs.mongodb.org/manual/tutorial/perform-two-phase- begår/).
Mönstret som föreslås i manualen är kortfattat att följa:
- Ställ in en separat
transactions
samling, som inkluderar måldokument , källdokument , värde och tillstånd (av transaktionen) - Skapa nytt transaktionsobjekt med
initial
somstate
- Börja göra en transaktion och uppdatera
state
tillpending
- Tillämpa transaktioner på båda dokumenten (mål, källa)
- Uppdatera transaktionsstatus till
committed
- Använd sök för att avgöra om dokument återspeglar transaktionsstatus, om det är ok, uppdatera transaktionstillstånd till
done
Dessutom:
- Du måste hantera felscenarier manuellt (något hände inte som beskrivs nedan)
- Du måste implementera en återställning manuellt, huvudsakligen genom att införa ett namn
state
värdecanceling
Några specifika anmärkningar för din implementering:
- Jag skulle avråda dig från att lägga till fält som
lock_status
,data_old
,data_new
i käll-/måldokument. Dessa ska vara transaktionernas egenskaper, inte själva dokumenten. - För att generalisera begreppet mål-/källdokument tror jag att du kan använda
DBref
s:http://www.mongodb.org/display/DOCS/Database+References - Jag gillar inte tanken på att ta bort transaktionsdokument när de är klara. Ställer in tillståndet till
done
verkar vara en bättre idé eftersom detta gör att du senare kan felsöka och ta reda på vilken typ av transaktioner som har utförts. Jag är ganska säker på att du inte kommer att få slut på diskutrymme heller (och för detta finns det lösningar också). - Hur garanterar du i din modell att allt har ändrats som förväntat? Inspekterar du ändringarna på något sätt?