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

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

Som et generisk svar kan multi-document commits på MongoDB udføres som to phase commits, som er blevet noget omfattende dokumenteret i manualen (se:http://docs.mongodb.org/manual/tutorial/perform-two-phase- begår/).

Det mønster, som vejledningen foreslår, er kort at følge:

  • Opret en separat transactions samling, der inkluderer måldokument , kildedokument , værdi og stat (af transaktionen)
  • Opret nyt transaktionsobjekt med initial som state
  • Begynd at foretage en transaktion, og opdater state til pending
  • Anvend transaktioner på begge dokumenter (mål, kilde)
  • Opdater transaktionstilstand til committed
  • Brug find til at bestemme, om dokumenter afspejler transaktionstilstanden. Hvis det er ok, skal du opdatere transaktionstilstanden til done

Derudover:

  • Du skal manuelt håndtere fejlscenarier (noget skete ikke som beskrevet nedenfor)
  • Du skal manuelt implementere en rollback, dybest set ved at introducere et navn state værdi canceling

Nogle specifikke bemærkninger til din implementering:

  • Jeg vil fraråde dig at tilføje felter som lock_status , data_old , data_new ind i kilde-/måldokumenter. Disse bør være egenskaber for transaktionerne, ikke selve dokumenterne.
  • For at generalisere begrebet mål-/kildedokumenter, tror jeg, du kunne bruge DBref s:http://www.mongodb.org/display/DOCS/Database+References
  • Jeg kan ikke lide tanken om at slette transaktionsdokumenter, når de er færdige. Indstiller tilstanden til done virker som en bedre idé, da dette giver dig mulighed for senere at fejlsøge og finde ud af, hvilken slags transaktioner der er blevet udført. Jeg er ret sikker på, at du heller ikke løber tør for diskplads (og til dette er der også løsninger).
  • Hvordan garanterer du i din model, at alt er blevet ændret som forventet? Inspicerer du ændringerne på en eller anden måde?


  1. Hvilke tegn er IKKE tilladt i MongoDB-feltnavne?

  2. mongodb:Multikey-indekseringsstruktur?

  3. Indstil Redis cache-præfiksnøgle på Symfony

  4. Næste stop – Opbygning af en datapipeline fra Edge til Insight