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
somstate
- Begynd at foretage en transaktion, og opdater
state
tilpending
- 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ærdicanceling
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?