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

Atomicité, isolation et simultanéité dans MongoDB

Les bases de données relationnelles les plus populaires aujourd'hui prennent en charge "ACID ” Propriétés – Atomicité, Cohérence, Isolation et Durabilité. Les développeurs et les DBA (administrateurs de base de données) travaillant avec des bases de données relationnelles ont une bonne compréhension du comportement ACID. Cependant, lorsque vous travaillez avec des bases de données NoSQL telles que le cloud MongoDB, il existe certaines différences clés qu'il est important que vous compreniez. MongoDB offre une grande flexibilité en matière de stockage, de schéma et de mise à l'échelle, mais assouplit certaines des propriétés ACID. Il est essentiel de comprendre les différences lorsque vous modélisez vos données et exécutez des commandes MongoDB.

Anomicité

Wikipédia définit l'« atomicité » comme suit – « Dans une transaction atomique , une série d'opérations de base de données soit toutes se produire, ou rien se produit. Une garantie d'atomicité empêche les mises à jour de la base de données de ne se produire que partiellement, ce qui peut causer des problèmes plus importants que le rejet pur et simple de la série entière. En d'autres termes, l'atomicité signifie indivisibilité et irréductibilité".

Les opérations d'écriture MongoDB sont atomiques, uniquement au niveau d'un seul document. Si vous modifiez plusieurs sous-documents à l'intérieur d'un document, l'opération est toujours atomique, mais si vous modifiez plusieurs documents, l'opération n'est pas atomique. Alors, comment obtenir un comportement atomique sur plusieurs documents ? Vous devez utiliser un modèle de "validation en deux phases" pour obtenir l'atomicité souhaitée. Voici un excellent exemple de la documentation MongoDB sur la façon d'implémenter ce modèle. Le modèle de validation en deux phases n'est pas trivial à mettre en œuvre et à obtenir correctement. Assurez-vous donc que l'atomicité d'écriture de plusieurs documents est quelque chose que vous voulez viser.

Isolement

Wikipedia définit l'« Isolation » comme suit – « Dans les systèmes de base de données , l'isolation est une propriété qui définit comment/quand les modifications apportées par une opération deviennent visibles pour d'autres opérations simultanées ». Il existe plusieurs façons d'obtenir l'isolation avec vos opérations MongoDB, par exemple :

  1. Commande "findAndModifyOperation()"

    C'est l'un des moyens les plus simples d'interroger et de modifier des documents existants. La commande peut renvoyer soit les valeurs précédentes des documents, soit les nouvelles valeurs mises à jour des documents. Vous pouvez également trier les documents correspondants, upsert et sélectionner les champs à renvoyer :

    db.collection.findAndModify( {
                                   query: <document>,
                                   sort: <document>,
                                   remove: <boolean>,
                                   update: <document>,
                                   new: <boolean>,
                                   fields: <document>,
                                   upsert: <boolean>
                               } );
  2. Modèle "Mettre à jour si actuel"

    Ce modèle est spécifié dans la documentation MongoDB. Cela implique plus de travail manuel mais vous donne plus de contrôle.

  3. Opérateur $isolation

    L'opérateur $isolation fournit un moyen d'isoler les écritures sur plusieurs documents. Cependant, l'opérateur $isolation ne fournit pas de garantie tout ou rien - vous devrez utiliser certaines des techniques d'atomicité spécifiées dans la première section pour y parvenir. De plus, l'opérateur $isolation ne fonctionne pas pour les partitions. Cette commande s'appelait auparavant "$atomic" - elle a maintenant été correctement renommée en "$isolated".

Concurrence

MongoDB utilise des verrous pour empêcher plusieurs clients de mettre à jour la même donnée en même temps. MongoDB 2.2+ utilise des verrous de niveau "base de données". Ainsi, lorsqu'une opération d'écriture verrouille la base de données, toutes les autres opérations d'écriture dans la même base de données (même si elles concernent une collection distincte) sont bloquées en attendant le verrou. MongoDB utilise des verrous « gourmands en écriture » qui favorisent les écritures plutôt que les lectures. Dans 2.2+, certaines opérations de longue durée peuvent céder leurs verrous.

Sécurité des threads

Toutes les classes du client MongoDB ne sont pas thread-safe - veuillez vous référer à la documentation de votre pilote spécifique pour vérifier si les classes que vous utilisez sont thread-safe. Par exemple, dans le pilote Java, la classe MongoClient est thread-safe. Ainsi, vous pouvez utiliser une seule instance de cette classe dans tous vos threads. En interne, MongoClient utilise un pool de connexions pour gérer les connexions au serveur MongoDB.

Comme toujours, si vous avez des questions, veuillez nous contacter à [email protected].