sql >> Databasteknik >  >> NoSQL >> MongoDB

Multi-samling, multi-dokument "transaktioner" i MongoDB

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 som state
  • Börja göra en transaktion och uppdatera state till pending
  • 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ärde canceling

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?


  1. Redis set vs hash

  2. Använd flera DB:er med ett Redis Lua-skript?

  3. Node.js, Mongo hitta och returnera data

  4. hur kontrollerar man redis-instansversionen?