Auf einen Blick: MongoDB-Transaktionen gewährleisten Datenkonsistenz durch Gruppierung von Operationen, was für Szenarien wie Vertrieb entscheidend ist. Sie erfordern Replikation und ein Cluster-Setup, können aber die Leistung beeinträchtigen, was Dokumenteneinbettung zu einer effizienteren Alternative macht.
- Transaktionen sind entscheidend für die Aufrechterhaltung der Datenintegrität.
- Erwägen Sie, Dokumente einzubetten, um die Leistung zu verbessern.
In der Informatik gibt es die Konzepte ACID (Atomizität, Konsistenz, Isolation, Haltbarkeit), atomare und referenzielle Integrität. Welchen Begriff du kennst, hängt stark vom Alter ab. Den letzten kenne ich, was dir einen Hinweis gibt, wie du den alten Ich bin.
Im Grunde bedeuten all diese Begriffe dasselbe: Es bedeutet, dass der Computer jede Transaktion auswerfen sollte, die zu einer logisch inkonsistenten Transaktionsmenge führen würde.
Warum ist das wichtig?
Stellen Sie sich vor, Sie hätten ein Verkaufsbestell- und Lagerbestandskontrollsystem. Wenn Sie einen Verkauf tätigen, sollte das den Lagerbestand reduzieren. Aber was passiert, wenn die Verkaufstransaktion funktioniert und das Lagerbestandsupdate fehlschlägt? Dann wäre die Datenbank nicht mehr konsistent: Der Bestand würde nicht mit den Verkäufen übereinstimmen.
Der Weg, das zu vermeiden, ist, die beiden Transaktionen zu einer größeren Transaktion zusammenzufassen. Oracle-Datenbankprogrammierer kennen dies als Start- und Commit-Anweisungen . MongoDB unterstützt dasselbe Konzept, das wir unten veranschaulichen.
Leistungseinbuß
Obwohl MongoDB Transaktionen unterstützt, betont es, dass es aufgrund von Leistungsproblemen besser ist, Dokumente als JSON-Arrays einzubetten. Mit anderen Worten: Packen Sie alle Daten eines einzelnen Elements und die zugehörigen Daten in ein einziges Dokument.
Oracle-Programmierer würden sagen, dass dies zu einer Datenbank führt, die nicht normalisiert ist. Aber das spielt keine Rolle, denn Big-Data-Datenbanken haben dieses Konzept abgeschafft und sagen, es sei in Ordnung, dieselben Daten in zwei Datensätzen zu speichern, da ihr Fokus auf Geschwindigkeit liegt und es keine Rolle spielt, zusätzlichen Speicherplatz zweimal zu speichern, da der Speicher günstiger wird als zu den Mainframe- und Solaris-Serverzeiten.
Mit anderen Worten: Es ist in Ordnung, die Postleitzahl 29607 und das Wort Greenville, SC in zwei Datensätzen zu haben. Sie müssen keine Postleitzahlentabelle als separate Einheit führen, wie es beim RDBMS-Ansatz der Fall wäre.
Erläuterte Transaktionen
Dafür brauchst du eine geclusterte MongoDB-Installation, aber du kannst so tun, als hättest du einen Cluster mit nur einem Server auf deinem Laptop. Stell dir einfach vor, dass die Repliken offline sind, indem du nicht nur einen Knoten installierst. Mit anderen Worten: Befolge diese Anweisungen, die wir geschrieben haben, aber entferne den Abschnitt in /etc/mongodConfig.conf, wie unten gezeigt, und richte nur einen Server ein.
sharding:
clusterRole: configsvr
Um Transaktionen zu verwenden, müssen Sie Replikation aktiviert und Sharding deaktiviert haben. Unterstützung für Sharded-Datenbanken ist mit MongoDB 4.2 verfügbar. Unten verwenden wir 4.0.5.
Erstelle einige Daten
Öffnen Sie die Mongo-Shell, erstellen Sie die Produkte und Verkaufskollektionen und fügen Sie dann ein Produkt zum Lagerbestand hinzu. Wir fügen 100 Artikel von Produkt 123 hinzu.
use products
db.createCollection("products")
db.createCollection("sales")
db.products.insert({product: 123, count: 100})
Verkaufe nun 4 Artikel von Produkt 123. Das Ergebnis wäre, dass 96 Artikel im Lager verbleiben. Füge also eine Verkaufstransaktion hinzu und aktualisiere den Lagerbestand auf 96, wie unten gezeigt.
Entweder fügst du diesen Code in die MongoDB-Shell ein oder speicherst ihn in einer JavaScript-Textdatei und führst ihn dann mit load('<Dateiname>') aus.
session = db.getMongo().startSession( { readPreference: { mode: "primary" } } );
productsCollection = session.getDatabase("products").products;
salesCollection = session.getDatabase("products").sales;
session.startTransaction( { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } } );
try {
salesCollection.insertOne( {
product: 123,
count: 4
}
);
productsCollection.update(
{ product: 123 },
{ $set:
{
count: 96
}
}
);
} catch (error) {
session.abortTransaction();
throw error;
}
session.commitTransaction();
session.endSession();
Erklärung des Kodex
Zuerst: Test, der durchgeführt wird:
db.products.findOne();
{
"_id" : ObjectId("5cb8ccb664ae78fe855e9431"),
"product" : 123,
"count" : 96
}
Die wichtigsten Teile des Codes sind:
| session.startTransaction( { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } } ); | Starte die Transaktion. |
|
session.commitTransaction(); session.endSession(); |
Committ-Transaktion. Sie erreicht nur hierher, wenn die Transaktionen zwischen den beiden Anweisungen wegen des try-catch-Blocks funktioniert haben. |
| session.abortTransaction() | Means führen keine der beiden Transaktionen durch. |
| productsCollection.update( { Produkt: 123 }, { $set: { Zählung: 96 } } ) |
Das Format davon ist db.collection.update (Abfrage für den Datensatz, welche Felder aktualisiert werden sollen). Wir aktualisieren Produkt 123 und setzen die Zählung auf 96. |
Fehlerbehebung
Wenn Sie dies mit Ihrer bestehenden Installation versuchen und keine Replikation aktiviert, kein Sharding ausgeschaltet oder unlogische Anweisungen im Code gemacht haben, erhalten Sie eine dieser Fehler:
- Transaktionsnummern sind nur auf einem Replica-Set-Member oder Mongo erlaubt.
- Multi-Dokument-Transaktionen können nicht in einem Sharded-Cluster ausgeführt werden, es sei denn, es wird 4.2 verwendet.
- Transaktionen werden nur in featureCompatibilityVersion 4.0 unterstützt. Siehe http://dochub.mongodb.org/core/4.0-feature-compatibility für weitere Informationen.
MongoDB-Leitfaden
- MongoDB-Überblick: Einstieg mit MongoDB
- Wie man MongoDB auf Ubuntu und Mac installiert
- Erstellung einer Datenbank in MongoDB
- MongoDB Shell Grundbefehle
- MongoDB Compass: Nutzung der Mongo GUI
- MongoDB rollenbasierte Zugriffskontrolle (RBAC) erklärt
- MongoDB-Projektion und Projektionsoperatoren erklärt
- MongoDB-Aggregatfunktionen erklärt
- MongoDB-Sortierung: sort()-Methode & Beispiele
- Verwendung von Push-and-Pull-Operatoren in MongoDB
- Wie man MongoDB $unwind
- 23 Gängige MongoDB-Abfrageoperatoren und deren Verwendung
- MongoDB GeoLocation-Abfragebeispiele
- Einführung in MongoDB-Transaktionen
- MongoDB-Indizes: Top-Indextypen und deren Verwaltung
- Die wichtigsten MongoDB-Befehle, die du kennen solltest
- MongoDB-Replikation: Eine vollständige Einführung
- Wie man einen MongoDB-Cluster einrichtet
- MongoDB Sharding: Konzepte, Beispiele & Tutorials
- MongoDB Atlas: Einrichtung und Nutzung von verwaltetem MongoDB
- Wie man MongoDB als Docker-Container ausführt
- MongoDB-Speichernutzung, Verwaltung und Anforderungen
- Wie man Mongodump für MongoDB-Backups verwendet
- Mongorestore-Beispiele zur Wiederherstellung von MongoDB-Backups
- Wie man PyMongo benutzt
- Wie man Mongoose für MongoDB und NodeJS verwendet
- MongoDB Spickzettel
- MongoDB vs Cassandra: NoSQL-Datenbanken im Vergleich
- PostgreSQL vs MongoDB: Vergleich von Datenbanken
- MySQL vs. MongoDB: Vergleich von Datenbanken
- MongoDB-Zertifizierungen: Eine Einführung
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.