En tant que réponse générique, les commits multi-documents sur MongoDB peuvent être exécutés en tant que commits en deux phases, qui ont été assez largement documentés dans le manuel (voir :http://docs.mongodb.org/manual/tutorial/perform-two-phase- commits/).
Le modèle suggéré par le manuel est brièvement le suivant :
- Configurer une
transactions
distincte collection, qui inclut le document cible , document source , valeur et indiquer (de la transaction) - Créer un nouvel objet de transaction avec
initial
commestate
- Commencez à effectuer une transaction et mettez à jour
state
àpending
- Appliquer les transactions aux deux documents (cible, source)
- Mettre à jour l'état de la transaction sur
committed
- Utilisez find pour déterminer si les documents reflètent l'état de la transaction, si ok, mettez à jour l'état de la transaction à
done
En plus :
- Vous devez gérer manuellement les scénarios d'échec (quelque chose ne s'est pas produit comme décrit ci-dessous)
- Vous devez implémenter manuellement une restauration, essentiellement en introduisant un nom
state
valeurcanceling
Quelques notes spécifiques pour votre implémentation :
- Je vous déconseille d'ajouter des champs comme
lock_status
,data_old
,data_new
dans les documents source/cible. Il doit s'agir des propriétés des transactions, et non des documents eux-mêmes. - Pour généraliser le concept de documents cible/source, je pense que vous pourriez utiliser
DBref
s :http://www.mongodb.org/display/DOCS/Database+References - Je n'aime pas l'idée de supprimer les documents de transaction lorsqu'ils sont terminés. Définition de l'état sur
done
semble être une meilleure idée car cela vous permet de déboguer plus tard et de savoir quel type de transactions ont été effectuées. Je suis sûr que vous ne manquerez pas non plus d'espace disque (et pour cela, il existe également des solutions). - Dans votre modèle, comment garantissez-vous que tout a été modifié comme prévu ? Inspectez-vous les modifications d'une manière ou d'une autre ?