MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Perché MongoDB non usa fsync()?

Il motivo sono le prestazioni. Senza dover scrivere su disco a ogni modifica, MongoDB può gestire gli aggiornamenti più velocemente.

MongoDB ti dice quando gli aggiornamenti sono stati consegnati al server, non quando gli aggiornamenti sono stati scritti , come puoi leggere nella documentazione su Verifica della propagazione di scritture con getLastError :

Questo va contro ACID , più precisamente contro la D, che sta per durability :

Le proprietà ACID si applicano principalmente ai tradizionali sistemi RDBMS. I sistemi NoSQL, che include MongoDB, rinunciano a una o più delle proprietà ACID per ottenere una migliore scalabilità. Nel caso di MongoDB la durata è stata sacrificata per prestazioni migliori quando si gestiscono grandi quantità di aggiornamenti.

MongoDB e ACID

La maggior parte delle proprietà ACID sono garanzie a livello di transazione . Una transazione è in genere un gruppo di query che dovrebbe essere trattata come una singola unità. MongoDB non ha il concetto di transazione, sempre per motivi di prestazioni . Pertanto la maggior parte delle proprietà ACID non si applica a MongoDB.

A — Atomicity afferma che una transazione dovrebbe avere esito positivo o negativo. Non è consentito avere successo parziale; se una parte della transazione non riesce, l'intera transazione deve essere annullata. MongoDB supporta operazioni atomiche a livello di documento, ma non a livello di "transazione".

C — La coerenza si riferisce in parte all'atomicità, ma include anche l'integrità referenziale . Un database relazionale ha la responsabilità di assicurarsi che tutti i riferimenti di chiave esterna siano validi. MongoDB non ha il concetto di chiavi esterne, quindi questa proprietà ACID non si applica.

Io — L'isolamento afferma che due transazioni simultanee non possono interferire l'una con l'altra; se due transazioni tentano di modificare gli stessi dati, la seconda transazione deve attendere il completamento della prima. Per ottenere ciò, il database bloccherà i dati. MongoDB non ha il concetto di blocco, quindi non supporta l'isolamento per multipli operazioni. Le singole operazioni sono isolate.

D — La durata è descritta sopra. MongoDB non supporta (ancora) la vera durabilità, in termini di durabilità ACID-ic.

Ora, potresti pensare che MongoDB sia inutile rispetto ai sistemi RDBMS perché manca di transazioni e della maggior parte delle garanzie ACID. Tuttavia, parte del motivo per cui esistono transazioni è che i database relazionali devono trattare determinati dati come una entità singola , ma questi dati sono stati normalizzati in più tabelle .

MongoDB ti consente di memorizzare i tuoi dati come un'unica entità . Ciò elimina la necessità di chiavi esterne e integrità referenziale nella maggior parte dei casi. Inoltre, non sono necessarie transazioni con più query, poiché non sono necessarie più tabelle per aggiornare una singola entità. La maggior parte delle volte devi aggiornare un solo documento e queste operazioni sono atomiche in MongoDB.

Secondo il primo commento su questa pagina , db.eval() fornisce isolamento per più operazioni. Tuttavia, secondo la documentazione di solito vuoi evitare l'uso di db.eval() .