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

Pourquoi MongoDB n'utilise-t-il pas fsync() ?

La raison est la performance. Sans avoir à écrire sur le disque à chaque modification, MongoDB peut gérer les mises à jour plus rapidement.

MongoDB vous indique quand les mises à jour ont été livrées au serveur, pas lorsque les mises à jour ont été écrites , comme vous pouvez le lire dans la documentation sur Verifying Propagation d'écritures avec getLastError :

Cela va à l'encontre de ACID , plus précisément contre le D, qui signifie durabilité :

Les propriétés ACID s'appliquent principalement aux systèmes RDBMS traditionnels. Les systèmes NoSQL, qui incluent MongoDB, abandonnent une ou plusieurs des propriétés ACID afin d'obtenir une meilleure évolutivité. Dans le cas de MongoDB, la durabilité a été sacrifiée pour de meilleures performances lors de la gestion de grandes quantités de mises à jour.

MongoDB et ACID

La plupart des propriétés ACID sont des garanties au niveau de la transaction . Une transaction est généralement un groupe de requêtes qui doivent être traitées comme une seule unité. MongoDB n'a pas de concept de transactions, encore une fois pour des raisons de performances . Par conséquent, la plupart des propriétés ACID ne s'appliquent pas à MongoDB.

A — L'atomicité indique qu'une transaction doit réussir ou échouer. Il n'est pas permis de réussir partiellement; si une partie de la transaction échoue, la totalité de la transaction doit être annulée. MongoDB prend en charge les les opérations atomiques au niveau du document, mais pas au niveau de la "transaction".

C — La cohérence fait partiellement référence à l'atomicité, mais inclut également l'intégrité référentielle . Une base de données relationnelle est chargée de s'assurer que toutes les références de clé étrangère sont valides. MongoDB n'a pas de concept de clés étrangères, donc cette propriété ACID ne s'applique pas.

Je — L'isolement stipule que deux transactions simultanées ne sont pas autorisées à interférer l'une avec l'autre ; si deux transactions tentent de modifier les mêmes données, la deuxième transaction doit attendre que la première se termine. Pour ce faire, la base de données verrouillera les données. MongoDB n'a pas de concept de verrouillage, il ne prend donc pas en charge l'isolation pour multiple opérations. Les opérations uniques sont isolées.

D — La durabilité est décrite ci-dessus. MongoDB ne prend pas (encore) en charge la véritable durabilité, en termes de durabilité ACID-ic.

Maintenant, vous pouvez penser que MongoDB est inutile par rapport aux systèmes RDBMS car il manque de transactions et de la plupart des garanties ACID. Cependant, une partie de la raison pour laquelle les transactions existent est que les bases de données relationnelles doivent traiter certaines données comme une entité unique , mais ces données ont été normalisées dans plusieurs tables .

MongoDB vous permet de stocker vos données en tant qu'entité unique . Cela supprime le besoin de clés étrangères et d'intégrité référentielle dans la plupart des cas. Vous n'avez pas non plus besoin de transactions multi-requêtes, car vous n'avez pas besoin de plusieurs tables pour mettre à jour une seule entité. La plupart du temps, vous n'avez qu'à mettre à jour un seul document, et ces opérations sont atomiques dans MongoDB.

Selon le premier commentaire sur cette page , db.eval() fournit une isolation pour plusieurs opérations. Cependant, selon la documentation vous voulez généralement éviter l'utilisation de db.eval() .