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:https://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
transactionsin verzameling, inclusief doeldocument , brondocument , waarde en staat (van de transactie) - Maak een nieuw transactie-object met
initialals destate - Begin met het maken van een transactie en update
statenaarpending - 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
statein te voeren waardecanceling
Enkele specifieke opmerkingen voor uw implementatie:
- Ik zou u afraden velden toe te voegen zoals
lock_status,data_old,data_newin 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:https://www.mongodb.org/display/DOCS/Database+References - Ik hou niet van het idee om transactiedocumenten te verwijderen als ze klaar zijn. Status instellen op
donelijkt 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?