Lorsque vous traitez avec MongoDB, quand devrais-je utiliser le {Safe: True} sur les requêtes? P>
En ce moment, j'utilise l'option "Safe '" pour vérifier si mes requêtes ont été insérées ou mises à jour avec succès. Cependant, je pense que cela pourrait être sur la mort. P>
Devrais-je supposer que 99% du temps, mes requêtes (supposant qu'elles sont correctement écrites) seront insérées / mises à jour, ne doivent pas avoir à vous soucier de vérifier si elles sont entrées avec succès? P>
pensées? p>
3 Réponses :
Coffre-fort n'est nécessaire que sur les écritures, pas lit. Les requêtes ne sont que des lectures. P>
En supposant que vous dites des requêtes, vous entendez réellement des écrivies / inserts (le libellé de votre question me fait penser que cela), la préoccupation écrite (coffre-fort, aucune, FSYNC, etc.) peut être utilisée pour obtenir plus de vitesse et moins de sécurité lorsque cela est acceptable et moins de sécurité et plus de sécurité lorsque cela est nécessaire. p>
Par exemple, une application hypothétique de style Facebook pourrait utiliser une écriture dangereuse pour "goûts" alors qu'elle utiliserait une écriture très sûre pour les modifications de mot de passe. La logique derrière ceci est qu'il y aura de mille mille mises à jour "comme" -style se produisant une seconde, et peu importe si l'on est perdue, alors que les mises à jour du mot de passe se produisent moins régulièrement, mais il est essentiel qu'ils réussissent. P>
Par conséquent, essayez d'adapter votre choix de préoccupation en écriture au type de mise à jour que vous effectuez, en fonction de vos besoins en matière de vitesse et d'intégrité des données. P>
Voici un autre cas d'utilisation où les écrires dangereux sont un choix approprié: vous faites un grand nombre d'écritures dans un ordre très court. Dans ce cas, vous pouvez effectuer un certain nombre d'écritures, puis appeller une dernière erreur pour voir si l'un d'entre eux a échoué. Si ce bloc réussit sans exception, alors toutes les données étaient inséré avec succès. S'il y avait une exception, une ou plusieurs des opérations d'écriture ont échoué, et vous devrez les réessayer (ou vérifier une violation d'index unique, etc.). Dans la vie réelle, vous pouvez appeler getlasterror tous les 10 écrit ou donc, pour éviter de resoumettre de nombreuses demandes. P> Ce modèle est très agréable pour la performance lors de l'exécution des inserts en vrac de grandes quantités de données. P > p>
Étant donné que les erreurs doivent revenir de manière asynchrone, comment savez-vous que vous avez attendu assez longtemps pour que toute erreur soit arrivée?
LEOPD: Les erreurs ne reviennent pas de manière asynchrone. Les blocs d'appels GetlasterRor jusqu'à ce qu'une réponse soit reçue.
Mais les écritures sont commises de manière asynchrone. Donc, à moins que GetLasterRor afflit le tampon d'écriture, il ne fera que signaler des erreurs qui se sont produites et ne peuvent pas savoir sur les écrivies qui n'ont pas encore fini.
@LEOPD: GetLasterRor attend tous les écritures pour terminer, puis signale le statut.
Impressionnant. Merci d'avoir clarifié ça!