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

Atomarität, Isolation und Parallelität in MongoDB

Die gängigsten relationalen Datenbanken unterstützen heute  „ACID ” Eigenschaften – Atomarität, Konsistenz, Isolierung und Haltbarkeit. Entwickler und DBAs (Datenbankadministratoren), die mit relationalen Datenbanken arbeiten, haben ein gutes Verständnis des ACID-Verhaltens. Bei der Arbeit mit NoSQL-Datenbanken wie der MongoDB-Cloud gibt es jedoch einige wichtige Unterschiede, die Sie verstehen sollten. MongoDB bietet große Flexibilität bei Speicherung, Schema und Skalierung, lockert jedoch einige der ACID-Eigenschaften. Es ist wichtig, die Unterschiede zu verstehen, wenn Sie Ihre Daten modellieren und MongoDB-Befehle ausführen.

Atomizität

Wikipedia definiert „Atomizität“ wie folgt – „In einer atomaren Transaktion , eine Reihe von Datenbankvorgängen, entweder alle auftreten, oder nichts tritt ein. Eine Garantie der Atomarität verhindert, dass Aktualisierungen der Datenbank nur teilweise erfolgen, was zu größeren Problemen führen kann, als wenn die gesamte Serie vollständig abgelehnt wird. Mit anderen Worten bedeutet Atomarität Unteilbarkeit und Irreduzibilität".

MongoDB-Schreibvorgänge sind atomar, nur auf der Ebene eines einzelnen Dokuments. Wenn Sie mehrere Filialdokumente innerhalb eines Dokuments ändern, ist die Operation immer noch atomar, aber wenn Sie mehrere Dokumente ändern, ist die Operation nicht atomar. Wie erreichen Sie also atomares Verhalten über mehrere Dokumente hinweg? Sie müssen ein „Zwei-Phasen-Commit“-Muster verwenden, um die gewünschte Atomarität zu erreichen. Hier ist ein großartiges Beispiel aus der MongoDB-Dokumentation zur Implementierung dieses Musters. Das zweiphasige Commit-Muster ist nicht trivial zu implementieren und richtig zu machen – stellen Sie also sicher, dass Sie die Unteilbarkeit beim Schreiben mehrerer Dokumente anstreben.

Isolierung

Wikipedia definiert „Isolation“ wie folgt – „In Datenbanksystemen Isolation ist eine Eigenschaft, die definiert, wie/wann die von einem Vorgang vorgenommenen Änderungen für andere gleichzeitige Vorgänge sichtbar werden". Es gibt mehrere Möglichkeiten, mit Ihren MongoDB-Operationen Isolation zu erreichen, zum Beispiel:

  1. "findAndModifyOperation()"-Befehl

    Dies ist eine der einfachsten Möglichkeiten, vorhandene Dokumente abzufragen und zu ändern. Der Befehl kann entweder die vorherigen Werte der Dokumente oder die neuen aktualisierten Werte der Dokumente zurückgeben. Sie können auch die übereinstimmenden Dokumente sortieren, aufwärts einfügen und auswählen, welche Felder zurückgegeben werden müssen:

    db.collection.findAndModify( {
                                   query: <document>,
                                   sort: <document>,
                                   remove: <boolean>,
                                   update: <document>,
                                   new: <boolean>,
                                   fields: <document>,
                                   upsert: <boolean>
                               } );
  2. Muster „Aktualisieren, wenn aktuell“

    Dieses Muster ist in der MongoDB-Dokumentation angegeben. Es erfordert mehr manuelle Arbeit, gibt Ihnen aber mehr Kontrolle.

  3. $Isolationsoperator

    Der $isolation-Operator bietet eine Möglichkeit, Schreibvorgänge in mehrere Dokumente zu isolieren. Der $isolation-Operator bietet jedoch keine Alles-oder-Nichts-Garantie – Sie müssen einige der im ersten Abschnitt beschriebenen Atomizitätstechniken anwenden, um dies zu erreichen. Außerdem funktioniert der $isolation-Operator nicht für Shards. Dieser Befehl hieß früher „$atomic“ – er wurde jetzt richtigerweise in „$isolated“ umbenannt.

Gleichzeitigkeit

MongoDB verwendet Sperren, um zu verhindern, dass mehrere Clients gleichzeitig dieselben Daten aktualisieren. MongoDB 2.2+ verwendet Sperren auf „Datenbank“-Ebene. Wenn also eine Schreiboperation die Datenbank sperrt, werden alle anderen Schreiboperationen in dieselbe Datenbank (selbst wenn sie in eine separate Sammlung gehen) blockiert und warten auf die Sperre. MongoDB verwendet „Writer-Greedy“-Sperren, die Schreibvorgänge gegenüber Lesevorgängen bevorzugen. In Version 2.2+ können bestimmte lang andauernde Operationen ihre Sperren aufgeben.

Thread-Sicherheit

Nicht alle MongoDB-Client-Klassen sind Thread-sicher – bitte sehen Sie in der Dokumentation Ihres spezifischen Treibers nach, um zu überprüfen, ob die von Ihnen verwendeten Klassen Thread-sicher sind. Beispielsweise ist die MongoClient-Klasse im Java-Treiber Thread-sicher. Sie können also eine einzige Instanz dieser Klasse für alle Ihre Threads verwenden. Intern verwendet MongoClient einen Verbindungspool, um Verbindungen zum MongoDB-Server zu verwalten.

Wenn Sie Fragen haben, wenden Sie sich bitte wie immer an [email protected].