sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Por qué MongoDB no usa fsync()?

La razón es el rendimiento. Sin tener que escribir en el disco en cada cambio, MongoDB puede manejar las actualizaciones más rápido.

MongoDB le informa cuándo se han entregado las actualizaciones al servidor, no cuando las actualizaciones han sido escritas , como puede leer en la documentación sobre Verificación de la propagación de escrituras con getLastError :

Esto va en contra de ACID , más específicamente contra la D, que significa durabilidad :

Las propiedades de ACID se aplican principalmente a los sistemas RDBMS tradicionales. Los sistemas NoSQL, que incluyen MongoDB, renuncian a una o más de las propiedades ACID para lograr una mejor escalabilidad. En el caso de MongoDB, se ha sacrificado la durabilidad para un mejor rendimiento al manejar grandes cantidades de actualizaciones.

MongoDB y ACID

La mayoría de las propiedades de ACID son garantías a nivel de transacción . Una transacción suele ser un grupo de consultas que deben tratarse como una sola unidad. MongoDB no tiene concepto de transacciones, de nuevo por razones de rendimiento . Por lo tanto, la mayoría de las propiedades de ACID no se aplican a MongoDB.

A — La atomicidad establece que una transacción debe tener éxito o fallar. No está permitido tener éxito parcial; si parte de la transacción falla, la transacción completa debe revertirse. MongoDB admite operaciones atómicas a nivel de documento, pero no a nivel de 'transacción'.

C — La consistencia se refiere parcialmente a la atomicidad, pero también incluye la integridad referencial . Una base de datos relacional es responsable de asegurarse de que todas las referencias de claves externas sean válidas. MongoDB no tiene concepto de claves foráneas, por lo que esta propiedad ACID no se aplica.

yo — El aislamiento establece que no se permite que dos transacciones simultáneas interfieran entre sí; si dos transacciones intentan modificar los mismos datos, la segunda transacción tiene que esperar a que se complete la primera. Para lograr esto, la base de datos bloqueará los datos. MongoDB no tiene el concepto de bloqueo, por lo que no admite el aislamiento para múltiples operaciones. Las operaciones individuales están aisladas.

D — La durabilidad se describe arriba. MongoDB no es compatible con la durabilidad real (todavía), en términos de durabilidad ACID-ic.

Ahora, puede pensar que MongoDB es inútil en comparación con los sistemas RDBMS porque carece de transacciones y la mayoría de las garantías ACID. Sin embargo, parte de la razón por la que existen transacciones es que las bases de datos relacionales necesitan tratar ciertos datos como una entidad única. , pero estos datos se han normalizado en varias tablas .

MongoDB le permite almacenar sus datos como una sola entidad . Esto elimina la necesidad de claves foráneas e integridad referencial en la mayoría de los casos. Tampoco necesita transacciones de consultas múltiples, porque no necesita varias tablas para actualizar una sola entidad. La mayoría de las veces solo tiene que actualizar un único documento, y estas operaciones son atómicas en MongoDB.

Según el primer comentario en esta página , db.eval() proporciona aislamiento para múltiples operaciones. Sin embargo, según la documentación por lo general, desea evitar el uso de db.eval() .