MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Warum verwendet MongoDB nicht fsync()?

Der Grund ist die Leistung. Ohne bei jeder Änderung auf die Festplatte schreiben zu müssen, kann MongoDB Aktualisierungen schneller verarbeiten.

MongoDB teilt Ihnen mit, wenn Updates geliefert wurden zum Server, nicht wenn die Updates geschrieben wurden , wie Sie in der Dokumentation zu Verifying Propagation nachlesen können Schreibvorgänge mit getLastError :

Dies verstößt gegen ACID , genauer gesagt gegen das D, das für durability steht :

ACID-Eigenschaften gelten hauptsächlich für traditionelle RDBMS-Systeme. NoSQL-Systeme, zu denen auch MongoDB gehört, verzichten auf eine oder mehrere der ACID-Eigenschaften, um eine bessere Skalierbarkeit zu erreichen. Im Fall von MongoDB wurde Haltbarkeit geopfert für eine bessere Leistung bei der Handhabung großer Mengen von Updates.

MongoDB und ACID

Die meisten ACID-Eigenschaften sind Garantien auf Transaktionsebene . Eine Transaktion ist normalerweise eine Gruppe von Abfragen, die als eine Einheit behandelt werden sollten. MongoDB hat kein Transaktionskonzept, wiederum aus Leistungsgründen . Daher gelten die meisten ACID-Eigenschaften nicht für MongoDB.

A — Atomicity besagt, dass eine Transaktion entweder erfolgreich sein oder fehlschlagen sollte. Es ist nicht erlaubt, teilweise erfolgreich zu sein; Wenn ein Teil der Transaktion fehlschlägt, sollte die gesamte Transaktion rückgängig gemacht werden. MongoDB unterstützt atomare Operationen auf Dokumentenebene, aber nicht auf Transaktionsebene.

C — Konsistenz bezieht sich teilweise auf Atomarität, schließt aber auch referenzielle Integrität ein . Eine relationale Datenbank ist dafür verantwortlich, sicherzustellen, dass alle Fremdschlüsselreferenzen gültig sind. MongoDB hat kein Konzept von Fremdschlüsseln, daher trifft diese ACID-Eigenschaft nicht zu.

Ich — Isolation besagt, dass zwei gleichzeitige Transaktionen sich nicht gegenseitig stören dürfen; Wenn zwei Transaktionen versuchen, dieselben Daten zu ändern, muss die zweite Transaktion warten, bis die erste abgeschlossen ist. Um dies zu erreichen, sperrt die Datenbank die Daten. MongoDB hat kein Sperrkonzept, daher unterstützt es keine Isolation für mehrere Operationen. Einzelne Operationen werden isoliert.

D — Haltbarkeit ist oben beschrieben. MongoDB unterstützt (noch) keine echte Dauerhaftigkeit im Sinne der ACID-ic-Stabilität.

Jetzt denken Sie vielleicht, dass MongoDB im Vergleich zu RDBMS-Systemen nutzlos ist, weil es an Transaktionen und den meisten ACID-Garantien mangelt. Ein Grund für die Existenz von Transaktionen ist jedoch, dass relationale Datenbanken bestimmte Daten als eine Einheit behandeln müssen , aber diese Daten wurden in mehrere Tabellen normalisiert .

Mit MongoDB können Sie Ihre Daten als einzelne Entität speichern . Dadurch werden Fremdschlüssel und referentielle Integrität in den meisten Fällen überflüssig. Sie benötigen auch keine Transaktionen mit mehreren Abfragen, da Sie nicht mehrere Tabellen benötigen, um eine einzelne Entität zu aktualisieren. Meistens müssen Sie nur ein einzelnes Dokument aktualisieren, und diese Vorgänge sind in MongoDB atomar.

Laut erster Kommentar auf dieser Seite , db.eval() bietet Isolation für mehrere Operationen. Jedoch laut Dokumentation Normalerweise möchten Sie die Verwendung von db.eval() vermeiden .