Причина в производительности. Без необходимости записи на диск при каждом изменении, MongoDB может обрабатывать обновления быстрее.
MongoDB сообщает вам, когда обновления были доставлены на сервер, а не когда записано , как вы можете прочитать в документации по Проверка распространения записей с getLastError :
Примечание: текущая реализация возвращается, когда данные были доставлены на серверы. В будущих версиях появится больше возможностей для доставки, чем, скажем, для физического fsync на сервере.
Это идет против КИСЛОТЫ , более конкретно против D, что означает долговечность :
Долговечность [гарантирует], что как только пользователь будет уведомлен об успешности транзакции, транзакция не будет потеряна, изменения данных транзакции сохранятся после сбоя системы, и что все ограничения целостности будут выполнены, поэтому СУБД не потребуется отменить транзакцию.
Свойства ACID в основном применяются к традиционным системам СУБД. Системы NoSQL, которые включают MongoDB, отказываются от одного или нескольких свойств ACID для достижения лучшей масштабируемости. В случае MongoDB долговечность была принесена в жертву для повышения производительности при обработке большого количества обновлений.
MongoDB и ACID
Большинство свойств ACID являются гарантиями на уровне транзакции . Транзакция, как правило, представляет собой группу запросов, которые должны рассматриваться как единое целое. MongoDB не имеет понятия транзакций, опять же по причинам производительности . Поэтому большинство свойств ACID не применяются к MongoDB.
A & mdash; Атомность заявляет, что транзакция должна либо успешно завершиться, либо провалиться Это не позволено частично преуспеть; если часть транзакции завершается неудачно, всю транзакцию необходимо откатить. MongoDB поддерживает атомарные операции на уровне документа, но не на уровне «транзакции».
C & mdash; Согласованность частично относится к атомарности, но также включает ссылочную целостность . Реляционная база данных отвечает за проверку правильности всех ссылок на внешние ключи. MongoDB не имеет понятия внешних ключей, поэтому это свойство ACID не применяется.
I & mdash; Изоляция гласит, что двум одновременным транзакциям не разрешается мешать друг другу; если две транзакции пытаются изменить одни и те же данные, вторая транзакция должна ждать завершения первой. Для этого база данных заблокирует данные. MongoDB не имеет концепции блокировки, поэтому он не поддерживает изоляцию для нескольких операций 1) . Отдельные операции изолированы.
D & mdash; Долговечность описана выше. MongoDB не поддерживает истинную долговечность (пока) с точки зрения стойкости к кислоте.
Теперь вы можете подумать, что MongoDB бесполезен по сравнению с системами RDBMS, потому что в ней отсутствуют транзакции и большинство гарантий ACID. Однако одна из причин того, что транзакции существуют, заключается в том, что реляционные базы данных должны обрабатывать определенные данные как единый объект , но эти данные были нормализованы в несколько таблиц .
MongoDB позволяет вам хранить ваши данные как один объект . Это устраняет необходимость в внешних ключах и ссылочной целостности в большинстве случаев. Вам также не нужны транзакции с несколькими запросами, потому что вам не нужно несколько таблиц для обновления одного объекта. В большинстве случаев вам нужно обновить только один документ, и эти операции в MongoDB являются атомарными.
1) Согласно первому комментарию на этой странице , db.eval()
обеспечивает изоляцию для нескольких операций. Однако, согласно документации , вы обычно хотите избегать использования db.eval()
.