Leser wie Sie helfen, MUO zu unterstützen. Wenn Sie über Links auf unserer Website einen Kauf tätigen, erhalten wir möglicherweise eine Affiliate-Provision.

Um eine produktionsreife Webanwendung zu erstellen, müssen Sie sicherstellen, dass sie sicher und skalierbar ist.

Eines der wichtigsten Dinge, die man über Datenbanken wissen sollte, ist das ACID-Prinzip, das für Atomarität, Konsistenz, Isolation und Dauerhaftigkeit steht. Relationale Datenbanken wie MySQL unterstützen ACID-Transaktionen nativ. Aber MongoDB ist eine NoSQL-Datenbank und unterstützt standardmäßig keine ACID-Transaktionen.

Als Programmierer sollten Sie wissen, wie Sie ACID-Eigenschaften in Ihre MongoDB-Datenbanken einführen.

Was sind Datenbanktransaktionen?

Eine Datenbanktransaktion ist eine Folge von Datenbankabfragen oder -operationen, die alle zusammen als eine Einheit ausgeführt werden, um eine Aufgabe abzuschließen.

Datenbanktransaktionen halten sich an die Konzepte der ACID-Eigenschaften. Dadurch wird sichergestellt, dass keine Änderungen auftreten, es sei denn, alle Vorgänge sind erfolgreich. Es stellt auch sicher, dass die Datenbank konsistent ist.

instagram viewer

Die ACID-Eigenschaften erklärt

Die vier Eigenschaften, aus denen sich die ACID-Prinzipien zusammensetzen, sind:

  • Atomizität ist die Eigenschaft, die Transaktionen als kleine Einheiten eines Programms konzipiert. Dies impliziert, dass alle Abfragen entweder erfolgreich ausgeführt werden oder zusammen fehlschlagen.
  • Konsistenz besagt, dass Datenbankeinträge vor und nach jeder Transaktion konsistent bleiben müssen.
  • Isolation stellt sicher, dass, wenn mehrere Transaktionen gleichzeitig ausgeführt werden, die eine die andere nicht beeinflusst.
  • Haltbarkeit konzentriert sich auf Systemausfälle oder Fehler. Es stellt sicher, dass eine festgeschriebene Transaktion im Falle eines Systemausfalls nicht verloren geht. Dies kann Techniken umfassen, die erforderlich sind, um Daten aus einer Sicherung automatisch wiederherzustellen, sobald das System wieder hochgefahren ist.

So implementieren Sie MongoDB-Datenbanktransaktionen in Node.js mit Mongoose

MongoDB hat sich im Laufe der Jahre zu einer weit verbreiteten Datenbanktechnologie entwickelt seine NoSQL-Natur und flexibles dokumentenbasiertes Modell. Es bietet Ihnen auch die Möglichkeit, Ihre Daten besser und flexibler zu organisieren als in SQL oder relationalen Datenbanken.

Um Datenbanktransaktionen in MongoDB zu implementieren, können Sie sich ein Beispielszenario für eine Stellenangebotsanwendung vorstellen, in der ein Benutzer einen Job veröffentlichen, aktualisieren oder löschen kann. Hier ist ein einfaches Datenbankschema-Design für diese Anwendung:

Für diesen Abschnitt sind Grundkenntnisse in Node.js-Programmierung und MongoDB erforderlich.

Transaktionen werden auf eigenständigen MongoDB-Installationen nicht unterstützt. Sie müssen a verwenden MongoDB-Replikatsatz oder Sharded MongoDB-Cluster damit Transaktionen funktionieren. Daher ist die einfachste Art, Transaktionen zu verwenden, folgende Erstellen Sie eine in der Cloud gehostete MongoDB-Instanz (MongoDB-Atlas). Standardmäßig ist jede Atlas-Datenbankinstanz ein Replikatsatz oder ein fragmentierter Cluster.

Nachdem Sie ein funktionierendes Node.js- und MongoDB-Projekt eingerichtet haben, können Sie in Node.js eine Verbindung zu einer Mongo-Datenbank einrichten. Wenn Sie es noch nicht getan haben, installieren Sie Mongoose, indem Sie es ausführen npm installiert Mungo in Ihrem Endgerät.

importieren Mungo aus 'Mungo'

Lassen Sie MONGO_URL = process.env. MONGO_URL || 'Ihre-Mongo-Datenbank-URL';

lassen Verbindung;
konst connectDb = asynchron () => {
versuchen {
erwarten mongoose.connect (MONGO_URL, {
useNewUrlParser: WAHR,
useUnifiedTopology: WAHR,
});

Konsole.log ("MIT DATENBANK VERBUNDEN");
Verbindung = Mungo.Verbindung;
} fangen (irren) {
Konsole.Fehler ("DATENBANKVERBINDUNG FEHLGESCHLAGEN!");
Konsole.Fehler(irren.Nachricht);
Verfahren.Ausfahrt(1); // Schließen Sie die App, wenn die Datenbankverbindung fehlschlägt
}
};

Sie sollten die Verbindung in einer Variablen speichern, damit Sie später im Programm eine Transaktion einleiten können.

Sie können die Benutzer- und Jobsammlungen wie folgt implementieren:

konst userSchema = neu Mungo. Schema({
Name: Schnur,
Email: Schnur,
Arbeitsplätze: [Mungo. Schema. Typen. Objekt Identifikation]
});

konst jobSchema = neu Mungo. Schema({
Titel: Schnur,
Standort: Schnur,
Gehalt: Schnur,
Poster: Mungo.Schema.Typen.Objekt Identifikation
});

const userCollection = mongoose.model ('Benutzer', Benutzerschema);
const jobCollection = mongoose.model ('Arbeit', jobSchema);

Sie können eine Funktion zum Hinzufügen eines Benutzers zur Datenbank wie folgt schreiben:


konst createUser = asynchron (Benutzer) => {
konst neuerBenutzer = erwarten userCollection.create (Benutzer);
Konsole.log("Benutzer zur Datenbank hinzugefügt");
Konsole.log (neuerBenutzer);
}

Der folgende Code demonstriert die Funktion, um einen Job zu erstellen und ihn mithilfe einer Datenbanktransaktion zur Liste der Jobs des Posters hinzuzufügen.


konst createJob = asynchron (Stelle) => {
konst { Benutzer-E-Mail, Titel, Standort, Gehalt } = Job;

// Holen Sie sich den Benutzer aus der DB
konst Benutzer = erwarten userCollection.findOne({ Email: Benutzer Email });

// Transaktionssitzung starten
konst Sitzung = erwarten connection.startSession();

// Alle Datenbankabfragen in einem Try-Catch-Block ausführen
versuchen {
erwarten session.startTransaction();

// Auftrag erstellen
konst neuerJob = erwarten jobCollection.create(
[
{
Titel,
Standort,
Gehalt,
Plakat: user._id,
},
],
{ Sitzung }
);
Konsole.log("Erstellt neu Job erfolgreich!");
Konsole.log (neuerJob[0]);

// Job zur Benutzerliste der veröffentlichten Jobs hinzufügen
konst neueJobId = neuerJob[0]._Ausweis;
konst AddedToUser = erwarten userCollection.findByIdAndUpdate(
Benutzer-ID,
{ $addToSet: { Arbeitsplätze: newJobId } },
{ Sitzung }
);

Konsole.log("Job erfolgreich zur Jobliste des Benutzers hinzugefügt");
Konsole.log (AddedToUser);

erwarten session.commitTransaction();

Konsole.log("DB-Transaktion erfolgreich durchgeführt");
} fangen (e) {
Konsole.Fehler (e);
Konsole.log("Datenbankoperationen konnten nicht abgeschlossen werden");
erwarten session.abortTransaction();
} Endlich {
erwarten session.endSession();
Konsole.log("Beendete Transaktionssitzung");
}
};

A erstellen Eine Abfrage, die in einer Transaktion ausgeführt wird, nimmt normalerweise ein Array auf und gibt es zurück. Sie können dies im obigen Code sehen, wo es erstellt wird neue Arbeit und speichert seine _Ausweis Eigentum in derneueJobId Variable.

Hier ist eine Demonstration, wie die oben genannten Funktionen funktionieren:

konst mockUser = {
Name: "Timmy Omolana",
E-Mail: "jobposter@example.com",
};

konst mockJob = {
Titel: "Verkaufsleiter",
Ort: "Lagos, Nigeria",
Gehalt: "$40,000",
Benutzer-E-Mail: "jobposter@example.com", // E-Mail des erstellten Benutzers
};

konst startServer = asynchron () => {
erwarten connectDb();
erwarten createUser (mockUser);
erwarten createJob (MockJob);
};

startServer()
.Dann()
.catch((fehler) => Konsole.log (fehler));

Wenn Sie diesen Code speichern und mit ausführen npm starten oder der Knoten Befehl, sollte es eine Ausgabe wie diese erzeugen:

Eine andere Möglichkeit, ACID-Transaktionen in MongoDB mit Mongoose zu implementieren, ist die Verwendung von mitTransaktion() Funktion. Dieser Ansatz bietet wenig Flexibilität, da er alle Abfragen innerhalb einer Callback-Funktion ausführt, die Sie als Argument an die Funktion übergeben.

Sie könnten die obige Datenbanktransaktion zur Verwendung umgestalten mitTransaktion() so was:

konst createJob = asynchron (Stelle) => {
konst { Benutzer-E-Mail, Titel, Standort, Gehalt } = Job;

// Holen Sie sich den Benutzer aus der DB
konst Benutzer = erwarten userCollection.findOne({ Email: Benutzer Email });

// Transaktionssitzung starten
konst Sitzung = erwarten connection.startSession();

// Alle Datenbankabfragen in einem Try-Catch-Block ausführen
versuchen {
konst TransaktionErfolg = erwarten session.withTransaction(asynchron () => {
konst neuerJob = erwarten jobCollection.create(
[
{
Titel,
Standort,
Gehalt,
Plakat: user._id,
},
],
{ Sitzung }
);

Konsole.log("Erstellt neu Job erfolgreich!");
Konsole.log (neuerJob[0]);

// Job zur Benutzerliste der veröffentlichten Jobs hinzufügen
konst neueJobId = neuerJob[0]._Ausweis;
konst AddedToUser = erwarten userCollection.findByIdAndUpdate(
Benutzer-ID,
{ $addToSet: { Arbeitsplätze: newJobId } },
{ Sitzung }
);

Konsole.log("Job erfolgreich zur Jobliste des Benutzers hinzugefügt");
Konsole.log (AddedToUser);
});

Wenn (Transaktionserfolg) {
Konsole.log("DB-Transaktion erfolgreich durchgeführt");
} anders {
Konsole.log("Transaktion fehlgeschlagen");
}
} fangen (e) {
Konsole.Fehler (e);
Konsole.log("Datenbankoperationen konnten nicht abgeschlossen werden");
} Endlich {
erwarten session.endSession();
Konsole.log("Beendete Transaktionssitzung");
}
};

Dies würde die gleiche Ausgabe wie die vorherige Implementierung erzeugen. Sie können frei wählen, welchen Stil Sie verwenden möchten, wenn Sie Datenbanktransaktionen in MongoDB implementieren.

Diese Implementierung verwendet nicht die commitTransaktion() Und abortTransaction() Funktionen. Dies liegt daran, dass die mitTransaktion() Funktion schreibt erfolgreiche Transaktionen automatisch fest und bricht fehlgeschlagene ab. Die einzige Funktion, die Sie in jedem Fall aufrufen sollten, ist die session.endSession() Funktion.

Implementieren von ACID-Datenbanktransaktionen in MongoDB

Datenbanktransaktionen sind einfach zu verwenden, wenn sie richtig durchgeführt werden. Sie sollten jetzt verstehen, wie Datenbanktransaktionen in MongoDB funktionieren und wie Sie sie in Node.js-Anwendungen implementieren können.

Um die Idee von ACID-Transaktionen und ihre Funktionsweise in MongoDB weiter zu erkunden, sollten Sie erwägen, eine Fintech-Wallet oder eine Blogging-Anwendung zu erstellen.