Einführung in MongoDB-Transaktionen

Einführung in MongoDB-Transaktionen

  • Orchestrierung
6 Minuten Lesezeit Aktualisiert Apr 26, 2019

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.

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus Orchestrierung

Abonnieren Sie The Brief

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Danke

Sie haben The Brief abonniert
Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.