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:https://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
transactionssamling, som inkluderar måldokument , källdokument , värde och tillstånd (av transaktionen) - Skapa nytt transaktionsobjekt med
initialsomstate - Börja göra en transaktion och uppdatera
statetillpending - 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
statevä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_newi 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
DBrefs:https://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
doneverkar 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?