MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Por que o MongoDB não usa fsync()?


O motivo é o desempenho. Sem ter que gravar em disco em cada alteração, o MongoDB pode lidar com atualizações mais rapidamente.

O MongoDB informa quando as atualizações foram entregues para o servidor, não quando as atualizações foram gravadas , como você pode ler na documentação em Verifying Propagation de gravações com getLastError :

Isso vai contra ACID , mais especificamente contra o D, que significa durabilidade :

As propriedades ACID aplicam-se principalmente a sistemas RDBMS tradicionais. Os sistemas NoSQL, que incluem o MongoDB, desistem de uma ou mais propriedades ACID para obter melhor escalabilidade. No caso do MongoDB, a durabilidade foi sacrificada para um melhor desempenho ao lidar com grandes quantidades de atualizações.

MongoDB e ACID


A maioria das propriedades ACID são garantias em nível de transação . Uma transação geralmente é um grupo de consultas que devem ser tratadas como uma única unidade. O MongoDB não tem nenhum conceito de transações, novamente por motivos de desempenho . Portanto, a maioria das propriedades ACID não se aplica ao MongoDB.

A — Atomicidade afirma que uma transação deve ser bem-sucedida ou falhar. Não é permitido ter sucesso parcial; se parte da transação falhar, a transação inteira deve ser revertida. O MongoDB suporta operações atômicas em um nível de documento, mas não em um nível de 'transação'.

C — A consistência refere-se parcialmente à atomicidade, mas também inclui integridade referencial . Um banco de dados relacional é responsável por garantir que todas as referências de chave estrangeira sejam válidas. O MongoDB não tem conceito de chaves estrangeiras, então essa propriedade ACID não se aplica.

Eu — Isolamento afirma que duas transações simultâneas não podem interferir uma na outra; se duas transações tentarem modificar os mesmos dados, a segunda transação deverá aguardar a conclusão da primeira. Para conseguir isso, o banco de dados bloqueará os dados. O MongoDB não tem o conceito de bloqueio, então não suporta isolamento para múltiplos operações. As operações únicas são isoladas.

D — A durabilidade está descrita acima. O MongoDB não suporta durabilidade real (ainda), em termos de durabilidade ACID-ic.

Agora, você pode pensar que o MongoDB é inútil comparado aos sistemas RDBMS porque não possui transações e a maioria das garantias ACID. No entanto, parte do motivo da existência das transações é que os bancos de dados relacionais precisam tratar determinados dados como uma entidade única , mas esses dados foram normalizados em várias tabelas .

O MongoDB permite armazenar seus dados como uma única entidade . Isso elimina a necessidade de chaves estrangeiras e integridade referencial na maioria dos casos. Você também não precisa de transações com várias consultas, porque não precisa de várias tabelas para atualizar uma única entidade. Na maioria das vezes você só precisa atualizar um único documento, e essas operações são atômicas no MongoDB.

De acordo com o primeiro comentário nesta página , db.eval() fornece isolamento para várias operações. No entanto, de acordo com a documentação você normalmente quer evitar o uso de db.eval() .