MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

"Transactions" multi-collections et multi-documents dans MongoDB

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 comme state
  • 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 valeur canceling

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 ?