ANNOUNCEMENTVoyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas. Learn more >
NEWSLearn why MongoDB was named a leader in the 2024 Gartner® Magic Quadrant™ Read the report >
NEWMongoDB 8.0: Experience unmatched speed and performance. Check it out >

Ein Leitfaden zu ACID-Eigenschaften in Datenbankmanagementsystemen

Durch die Nutzung von Echtzeitanwendungen und Geräten des Internets der Dinge (IoT) sowie das exponentielle Wachstum unstrukturierter Datenbestände wechseln immer mehr Unternehmen zu NoSQL-Datenbanken. Tatsächlich wird erwartet, dass der NoSQL-Markt bis 2032 ein Volumen von 74,5 Milliarden US-Dollar erreichen wird, was im Zeitraum von 2024 bis 2032 einer kumulierten jährlichen Wachstumsrate (CAGR) von 24,9 % entspricht (IMARC-Gruppe, 2024).Dieses Wachstum ist nicht überraschend, wenn man bedenkt, dass NoSQL-Datenbankmanagementsysteme (DBMS) große, vielfältige Datensätze effektiv verwalten können und die damit verbundene Big-Data-Analyse erforderlich ist. Viele sind jedoch nach wie vor der Meinung, dass NoSQL-DBMS nicht in der Lage sind, eine wichtige Anforderung vieler Unternehmen zu erfüllen – die Verwaltung und Einhaltung von ACID-Transaktionen. Die gute Nachricht ist, dass einige NoSQL-DBMS dies absolut können!

In diesem Artikel besprechen wir, was ACID-Transaktionen sind, welche Eigenschaften ACID-Transaktionen haben, warum diese Transaktionen wichtig sind und geben ein Beispiel für eine ACID-Transaktion in einem NoSQL-DBMS.


Inhaltsverzeichnis

Was sind ACID-Transaktionen?


Transactions explained

Im Grunde genommen handelt es sich bei Datenbanktransaktionen um eine Gruppe von Datenbanklese- und -schreibvorgängen, die gemäß DBMS-Definitionen (z. B. definierte Transaktionskriterien) erfolgreich abgeschlossen wurden. Es gibt zwei Haupttypen von Transaktionen:

  • Einzeltransaktionen: Eine Einzeltransaktion bezieht sich auf eine Reihe von einem oder mehreren Datenbankvorgängen, die zu einer Aktion führen und erfolgreich abgeschlossen werden. Nach Abschluss wird die Transaktion akzeptiert und ist in einem Transaktionslog zu finden. Ein gängiges Beispiel für eine Einzeltransaktion ist die Geldabhebung an einem Geldautomaten.

  • Multitransaktionen: Eine Multitransaktion, auch verteilte Transaktion genannt, besteht aus mehreren, voneinander abhängigen Transaktionen, die über verschiedene Datenbanken und Systeme (z. B. verteilte Systeme) verteilt sind. Aufzeichnungen dieser Transaktionen finden sich auch in einem Transaktionslog. Ein Beispiel für diese Transaktionen ist die Überweisung von Geld von einem Konto auf ein anderes oder die Ausstellung eines Sicherheitsausweises mit Foto für einen neuen Mitarbeiter durch den Arbeitgeber.

Es ist wichtig zu beachten, dass einige Transaktionen strenge Standards der Datenintegrität (z. B. Daten sind vollständig und korrekt) und Datenkonsistenz (z. B. der Wert ist in allen Tabellen/Datenbanken gleich) einhalten müssen. Dies ist häufig der Fall, wenn es um treuhänderische Verantwortung oder die Einhaltung gesetzlicher Vorschriften geht. Beispiele hierfür sind das kommerzielle Bankgeschäft, die Vermittlung von Investitionen und die Abwicklung von Rechtsgeschäften. In diesen Situationen reicht die standardmäßige Einhaltung der DBMS-Definitionen nicht aus, und es sind ACID-Transaktionen erforderlich.

ACID-Transaktionen

ACID ist ein Akronym, das für Atomicity (Atomizität), Consistency (Konsistenz), Isolation (Isolation) und Durability (Dauerhaftigkeit) steht. Zusammen stellen die ACID-Eigenschaften sicher, dass eine Reihe von Datenbankoperationen (die in einer Transaktion zusammengefasst sind) die Datenbank auch im Falle unerwarteter Fehler in einem gültigen Zustand verlassen. Darüber hinaus bieten ACID-Transaktionen das Maß an Transaktionsgarantien, das von vielen Aufsichtsbehörden gefordert wird.

Nachfolgend finden Sie eine allgemeine Übersicht über jedes ACID-Transaktionselement sowie eine Beschreibung, wie eine NoSQL-Dokumentendatenbank dieses ACID-Element verarbeiten kann. Für die Zwecke dieses Artikels wird MongoDB Atlas verwendet.


Atomizität

Die Atomizität garantiert, dass alle Befehle, aus denen eine Transaktion besteht, als eine Einheit behandelt werden und entweder alle zusammen erfolgreich sind oder alle zusammen fehlschlagen. Dies ist im Falle eines System- oder Stromausfalls wichtig, da eine nicht vollständig verarbeitete Transaktion verworfen wird und die Datenbank ihre Datenintegrität beibehält.


So geht MongoDB mit Atomizität um:

In MongoDB ist ein Schreibvorgang auf der Ebene eines einzelnen Dokuments atomar, selbst wenn der Vorgang mehrere eingebettete Dokumente innerhalb eines einzelnen Dokuments ändert. Für Situationen, die atomare Lese- und Schreibvorgänge in mehreren Dokumenten (in einer einzelnen Sammlung oder mehreren Sammlungen) erfordern, unterstützt MongoDB verteilte Transaktionen, einschließlich Transaktionen in Replikatsätzen und Sharded Clusters.


Konsistenz

Konsistenz garantiert, dass Änderungen, die innerhalb einer Transaktion vorgenommen werden, im gesamten Datenbanksystem (z. B. Knoten) und in Übereinstimmung mit den DBMS-Beschränkungen übernommen werden. Wenn die Datenkonsistenz durch eine Transaktion in einem inkonsistenten Zustand negativ beeinflusst wird, schlägt die gesamte Transaktion fehl.

So handhabt MongoDB die Konsistenz:

MongoDB bietet die Flexibilität, Daten zu normalisieren oder zu duplizieren, um Anwendungen zu optimieren. Wenn Daten im Schema dupliziert werden, muss der Entwickler entscheiden, wie duplizierte Daten über mehrere Sammlungen hinweg konsistent gehalten werden sollen. Bei einigen Anwendungen müssen duplizierte Daten sofort konsistent gemacht werden, während andere Anwendungen das Lesen veralteter Daten tolerieren können. Beispiele sind im Folgenden dargestellt:

MethodeBeschreibungAuswirkungen auf die LeistungNutzung
TransaktionenAktualisierungen mehrerer Sammlungen erfolgen in einer einzigen atomaren Operation.Potenziell hoch, aufgrund von LesekonfliktenDeine Anwendung muss immer aktuelle Daten zurückgeben und kann potenzielle negative Auswirkungen auf die Leistung in Zeiten hoher Lesezugriffe tolerieren.
Verwandte Daten einbettenÄndere das Anwendungsschema, um verwandte Daten in einer einzigen Sammlung einzubetten.Gering bis mäßig, mit potenziellen Verzögerungen bei der Verarbeitung ausgelöster Ereignisse, je nach Dokumentgröße und IndizesDeine Anwendung liest und aktualisiert die zugehörigen Daten immer gleichzeitig. Diese Lösung vereinfacht Ihr Schema und macht $lookup Operationen überflüssig.
Atlas-Datenbank-TriggerWenn in einer Sammlung eine Aktualisierung erfolgt, wird eine andere Sammlung automatisch aktualisiert.Gering bis mäßig, mit potenziellen Verzögerungen bei der Verarbeitung ausgelöster EreignisseIhre Anwendung kann das Lesen leicht veralteter Daten tolerieren. Benutzer können möglicherweise veraltete Daten sehen, wenn sie eine Abfrage unmittelbar nach einer Aktualisierung ausführen, aber bevor der Trigger die Aktualisierung der zweiten Sammlung abgeschlossen hat.

Methode

Beschreibung
TransaktionenAktualisierungen mehrerer Sammlungen erfolgen in einer einzigen atomaren Operation.
Verwandte Daten einbettenÄndere das Anwendungsschema, um verwandte Daten in einer einzigen Sammlung einzubetten.
Atlas-Datenbank-TriggerWenn in einer Sammlung eine Aktualisierung erfolgt, wird eine andere Sammlung automatisch aktualisiert.
Auswirkungen auf die Leistung
TransaktionenPotenziell hoch, aufgrund von Lesekonflikten
Verwandte Daten einbettenGering bis mäßig, mit potenziellen Verzögerungen bei der Verarbeitung ausgelöster Ereignisse, je nach Dokumentgröße und Indizes
Atlas-Datenbank-TriggerGering bis mäßig, mit potenziellen Verzögerungen bei der Verarbeitung ausgelöster Ereignisse
Nutzung
TransaktionenDeine Anwendung muss immer aktuelle Daten zurückgeben und kann potenzielle negative Auswirkungen auf die Leistung in Zeiten hoher Lesezugriffe tolerieren.
Verwandte Daten einbettenDeine Anwendung liest und aktualisiert die zugehörigen Daten immer gleichzeitig. Diese Lösung vereinfacht Ihr Schema und macht $lookup Operationen überflüssig.
Atlas-Datenbank-TriggerIhre Anwendung kann das Lesen leicht veralteter Daten tolerieren. Benutzer können möglicherweise veraltete Daten sehen, wenn sie eine Abfrage unmittelbar nach einer Aktualisierung ausführen, aber bevor der Trigger die Aktualisierung der zweiten Sammlung abgeschlossen hat.

Hinweis: Erfahren Sie mehr über Datenkonsistenz.


Isolation

Jede Transaktion wird von den anderen Transaktionen isoliert, um Datenkonflikte zu vermeiden. Dies erleichtert auch Datenbankvorgänge im Zusammenhang mit der Verwaltung mehrerer Einträge und mehrstufiger Transaktionen. Wenn beispielsweise zwei Benutzer versuchen, dieselben Daten (oder sogar dieselbe Transaktion) zu ändern, verwendet das DBMS einen Mechanismus, der als Sperrmanager bezeichnet wird, um andere Benutzer auszusetzen, bis die vom ersten Benutzer vorgenommenen Änderungen abgeschlossen sind.


Wie MongoDB die Isolation handhabt:

MongoDB verwendet eine Technik namens „Snapshot Isolation“ (d. h., jede Transaktion scheint auf einem persönlichen Snapshot der Datenbank zu basieren, der zu Beginn der Transaktion erstellt wurde). Transaktionen können Daten aus dem „Snapshot“ der Daten lesen, die zum Zeitpunkt des Transaktionsstarts festgelegt wurden, und alle widersprüchlichen Aktualisierungen führen zum Abbruch der Transaktion.

Darüber hinaus unterstützen MongoDB-Transaktionen einen Lesemodus auf Transaktionsebene und einen Schreibmodus auf Transaktionsebene. Kunden können ein geeignetes Maß an Lese- und Schreibzugriff festlegen, wobei das strengste Maß der Lesezugriff mit Momentaufnahme in Kombination mit dem Mehrheitsschreibzugriff ist. „Majority Write Concern“ bedeutet, dass die Schreibvorgänge dauerhaft an eine berechnete Mehrheit der datentragenden Knoten gebunden sind (vom Entwickler konfigurierbar).


Dauerhaftigkeit

Die Dauerhaftigkeit garantiert, dass Änderungen nach Abschluss der Transaktion in die Datenbank geschrieben und dort beibehalten werden. Dadurch wird sichergestellt, dass die Daten innerhalb des Systems auch bei Systemausfällen wie Abstürzen oder Stromausfällen erhalten bleiben. Das Konzept der Dauerhaftigkeit ist ein Schlüsselelement für die Zuverlässigkeit von Daten.


So handhabt MongoDB die Dauerhaftigkeit:

MongoDB erstellt ein OpLog, das den Datenträgerspeicherort und die bei jedem „Schreibvorgang“ geänderten Bytes enthält. Wenn während des Schreibvorgangs ein unvorhergesehenes Ereignis (z. B. ein Stromausfall) eintritt, kann OpLog beim Neustart des Systems verwendet werden, um alle Schreibvorgänge erneut abzuspielen, die vor dem Herunterfahren nicht auf die Festplatte geschrieben wurden. Darüber hinaus werden Vorgänge geändert, bevor sie in OpLog geschrieben werden, sodass sie idempotent sind und mehrmals wiederholt werden können. Transaktionen oder „Schreibvorgänge“ werden standardmäßig etwa alle 60 Sekunden auf die Festplatte geschrieben.

Warum sind ACID-Transaktionen wichtig?

ACID-Transaktionen tragen zur Wahrung der Datenintegrität und -zuverlässigkeit bei und gewährleisten zugleich, dass wichtige Daten, die gesetzlichen oder branchenspezifischen Vorschriften unterliegen (z. B. Bankkonten, Aktienportfolios), die erforderlichen Standards erfüllen. Darüber hinaus ist die Einhaltung von ACID oft eine Voraussetzung für die Implementierung der Datenreplikation und die Erzielung einer hohen Verfügbarkeit in verteilten Datenbanksystemen.

ACID-Transaktionsbeispiel in DBMS

Anhand der NoSQL-Dokumentendatenbank MongoDB Atlas wird hier ein Beispiel dafür gegeben, wie ACID-Multidokumenttransaktionen gehandhabt werden und wie ACID-Transaktionen die Ausrichtung an den Mindeststandards für ACID-Eigenschaften gewährleisten.

ACID-Transaktionen mit mehreren Dokumenten

Stellen Sie sich vor, Sie erstellen eine Funktion, um Geld von einem Bankkonto auf ein anderes zu überweisen, wobei jedes Konto einen eigenen Datensatz darstellt. Wenn Geld erfolgreich vom Quellkonto abgebucht, aber nie dem Zielkonto gutgeschrieben wird, ist ein schwerwiegendes Buchhaltungsproblem entstanden. Umgekehrt tritt ein weiteres schwerwiegendes Problem in der Buchhaltung auf, wenn das Zielkonto zwar eine Gutschrift erhält, das Quellkonto jedoch nie belastet wird.


Diagramm, das zeigt, wie sich die ACID-Eigenschaften auf den Geldfluss von einem Bankkonto auf ein anderes auswirken. Das Diagramm zeigt, wie sich die ACID-Eigenschaften auf den Geldtransfer von einem Bankkonto auf ein anderes auswirken.


Diese beiden Schreibvorgänge müssen entweder beide stattfinden oder beide nicht stattfinden, damit das System und seine Daten konsistent bleiben. Außerdem bedeutet dies, dass die Datenbank alle Änderungen, die sie im Verlauf der Transaktion vorgenommen hat, rückgängig machen (d. h. widerrufen) muss, wenn ein Befehl in der Transaktion fehlschlägt.


Codebeispiel von GitHub in Zusammenarbeit mit MongoDB

Hinweis: Weitere Informationen finden Sie im Node.js Quick Start GitHub-Repository, wo Sie eine Kopie des vollständigen Codebeispiels erhalten und es selbst ausführen können.


Auswirkungen, die Sie im Auge behalten sollten

Wenn Sie mit Transaktionen mit mehreren Dokumenten in einem verteilten System arbeiten, sollten Sie bedenken, dass es zu einer Beeinträchtigung der Leistung kommt, die sich auf die Ressourcenbeschränkungen und Leistungsziele auswirken kann. Da die Datenbank die beteiligten Ressourcen „sperren“ muss, um zu verhindern, dass gleichzeitige Schreibvorgänge sich gegenseitig stören (z. B. Transaktionsfehler), können andere Clients, die versuchen, Daten zu schreiben, möglicherweise nicht weiterkommen und auf den Abschluss der Transaktion warten, was sich auf die Anwendungslatenz und die Benutzererfahrung auswirken kann.

Wie funktionieren ACID-Transaktionen in MongoDB?

Das Dokumentmodell von MongoDB ermöglicht es, zusammengehörige Daten in einem einzigen Dokument zu speichern. Das Dokumentmodell macht in Kombination mit atomaren Dokumentaktualisierungen Transaktionen in den meisten Anwendungsfällen überflüssig. Dennoch gibt es Fälle, in denen echte MongoDB-Transaktionen mit mehreren Dokumenten und mehreren Sammlungen die beste Wahl sind.

MongoDB-Transaktionen funktionieren ähnlich wie Transaktionen in anderen Datenbanken. Um eine Transaktion zu verwenden, starten Sie eine MongoDB-Sitzung über einen Treiber. Verwenden Sie dann diese Sitzung, um Ihre Gruppe von Datenbankoperationen auszuführen. Sie können jeden der CRUD-Vorgänge (Create, Read, Update und Delete) über mehrere Dokumente, Sammlungen und Shards hinweg ausführen.

Spezifische Codebeispiele für die Implementierung von Transaktionen finden Sie in den Schnellstarts im MongoDB-Entwicklerzentrum:

Besuchen Sie die MongoDB drivers documentation für sprachspezifische Anleitungen zu jeder der von MongoDB offiziell unterstützten Sprachen. Sie können auch eine Liste mit Best Practices für Transaktionen und Überlegungen zur Produktion anzeigen.

Wann sollte ich MongoDB-Transaktionen für mehrere Dokumente verwenden?

Anwendungen, die Transaktionen erfordern, haben in der Regel Anwendungsfälle, bei denen Werte zwischen verschiedenen Parteien ausgetauscht werden. Dabei handelt es sich typischerweise um „System of Record“- oder „Line of Business“-Anwendungen.

Beispiele für Anwendungen, die von Transaktionen mit mehreren Dokumenten profitieren können, sind:

  • Systeme, die Gelder von einem Konto auf ein anderes übertragen (z. B. Bankanwendungen, Zahlungsverarbeitungssysteme, Handelsplattformen).

  • Lieferketten- und Buchungssysteme, bei denen das Eigentum an Waren und Dienstleistungen von einer Partei auf eine andere übertragen wird.

  • Abrechnungssysteme, die Informationen sowohl in Detail- als auch in Übersichtsaufzeichnungen speichern.

Was sind die Best Practices für Transaktionen in MongoDB?

Im Allgemeinen wird empfohlen, Daten so zu modellieren, dass gemeinsam genutzte Daten auch gemeinsam gespeichert werden. Wenn die Daten auf diese Weise modelliert werden, wird nicht nur eine bessere Leistung erzielt, sondern es sind auch keine Transaktionen erforderlich.

Für Anwendungen, die Transaktionen erfordern, sollten Sie die folgenden Best Practices einhalten:

  • Teilen Sie lang andauernde Transaktionen in kleinere Einheiten auf, damit sie die standardmäßige Timeout-Zeit von 60 Sekunden nicht überschreiten. (Beachten Sie, dass diese Zeitüberschreitung verlängert werden kann.) Stellen Sie sicher, dass die Vorgänge in Transaktionen Indizes verwenden, damit sie schnell ausgeführt werden können.

  • Beschränken Sie jede Transaktion auf 1.000 Dokumentenänderungen

  • Stellen Sie sicher, dass die entsprechenden Lese- und Schreibberechtigungen konfiguriert sind (beachten Sie, dass MongoDB ab Version 5.0 standardmäßig die erforderliche Mehrheitsschreibberechtigung verwendet).

  • Fügen Sie eine entsprechende Fehlerbehandlung hinzu und wiederholen Sie Transaktionen, die aufgrund vorübergehender Fehler fehlschlagen.

  • Denken Sie an die Leistungseinbußen von Transaktionen, die mehrere Shards betreffen. Weitere Informationen zu diesen Best Practices finden Sie im Whitepaper „Multi-Dokument-ACID-Transaktionen mit MongoDB“ sowie in der MongoDB-Dokumentation zu Transaktionen.

Nächste Schritte

Möchten Sie mehr erfahren? MongoDB Atlas ist MongoDBs vollständig verwaltete Datenbank als Service und der einfachste Weg, um mit der Nutzung von MongoDB zu beginnen. Beginnen Sie mit Transaktionen, indem Sie einen kostenlosen MongoDB-Atlas-Cluster erstellen.

FAQs

Was sind Transaktionen über mehrere Dokumente hinweg?

Eine Transaktion mit mehreren Dokumenten, manchmal auch als verteilte Transaktion bezeichnet, besteht aus mehreren voneinander abhängigen Transaktionen, die über verschiedene Datenbanken und Systeme verteilt sind.

Was sind ACID-Transaktionen?

Eine ACID-Transaktion ist eine Reihe von Operationen in einem Datenbanksystem, die mit den ACID-Eigenschaften übereinstimmen.

Was sind die ACID-Eigenschaften einer Transaktion?

Die vier Schlüsseleigenschaften von ACID sind Atomizität, Konsistenz, Isolation und Dauerhaftigkeit.