Als een generiek antwoord kunnen multi-document commits op MongoDB worden uitgevoerd als commits in twee fasen, die enigszins uitgebreid zijn gedocumenteerd in de handleiding (zie:http://docs.mongodb.org/manual/tutorial/perform-two-phase- commits/).
Het patroon dat in de handleiding wordt voorgesteld, is in het kort het volgende:
- Stel een aparte
transactions
in verzameling, inclusief doeldocument , brondocument , waarde en staat (van de transactie) - Maak een nieuw transactie-object met
initial
als destate
- Begin met het maken van een transactie en update
state
naarpending
- Transacties toepassen op beide documenten (doel, bron)
- Transactiestatus bijwerken naar
committed
- Gebruik find om te bepalen of documenten de transactiestatus weergeven, indien ok, update de transactiestatus naar
done
Bovendien:
- U moet faalscenario's handmatig afhandelen (er gebeurde iets niet zoals hieronder beschreven)
- U moet handmatig een rollback implementeren, in feite door een naam
state
in te voeren waardecanceling
Enkele specifieke opmerkingen voor uw implementatie:
- Ik zou u afraden velden toe te voegen zoals
lock_status
,data_old
,data_new
in bron-/doeldocumenten. Dit moeten eigenschappen van de transacties zijn, niet de documenten zelf. - Om het concept van doel-/brondocumenten te veralgemenen, denk ik dat je
DBref
. zou kunnen gebruiken s:http://www.mongodb.org/display/DOCS/Database+References - Ik hou niet van het idee om transactiedocumenten te verwijderen als ze klaar zijn. Status instellen op
done
lijkt een beter idee, omdat u hierdoor later kunt debuggen en kunt achterhalen wat voor soort transacties zijn uitgevoerd. Ik ben er vrij zeker van dat je ook niet te weinig schijfruimte zult hebben (en hier zijn ook oplossingen voor). - Hoe garandeer je in je model dat alles is veranderd zoals verwacht? Inspecteer je de wijzigingen op de een of andere manier?