Frühling - Transaktionsmanagement
Eine Datenbanktransaktion ist eine Folge von Aktionen, die als einzelne Arbeitseinheit behandelt werden. Diese Aktionen sollten entweder vollständig abgeschlossen sein oder überhaupt keine Wirkung haben. Das Transaktionsmanagement ist ein wichtiger Bestandteil der RDBMS-orientierten Unternehmensanwendung, um die Datenintegrität und -konsistenz sicherzustellen. Das Konzept von Transaktionen kann mit den folgenden vier Schlüsseleigenschaften beschrieben werden:ACID - -
Atomicity - Eine Transaktion sollte als eine einzelne Operationseinheit behandelt werden. Dies bedeutet, dass entweder die gesamte Abfolge von Operationen erfolgreich oder nicht erfolgreich ist.
Consistency - Dies repräsentiert die Konsistenz der referenziellen Integrität der Datenbank, eindeutiger Primärschlüssel in Tabellen usw.
Isolation- Möglicherweise werden viele Transaktionen gleichzeitig mit demselben Datensatz verarbeitet. Jede Transaktion sollte von anderen isoliert werden, um eine Beschädigung der Daten zu verhindern.
Durability - Sobald eine Transaktion abgeschlossen ist, müssen die Ergebnisse dieser Transaktion dauerhaft gemacht werden und können aufgrund eines Systemfehlers nicht aus der Datenbank gelöscht werden.
Ein echtes RDBMS-Datenbanksystem garantiert alle vier Eigenschaften für jede Transaktion. Die vereinfachte Ansicht einer Transaktion, die mit SQL an die Datenbank ausgegeben wurde, lautet wie folgt:
Starten Sie die Transaktion mit dem Befehl begin transaction .
Führen Sie verschiedene Lösch-, Aktualisierungs- oder Einfügevorgänge mithilfe von SQL-Abfragen aus.
Wenn alle die Operation erfolgreich ist dann ausführen begeht sonst Rollback alle Vorgänge.
Das Spring Framework bietet eine abstrakte Ebene über verschiedenen zugrunde liegenden Transaktionsverwaltungs-APIs. Die Transaktionsunterstützung von Spring soll eine Alternative zu EJB-Transaktionen darstellen, indem POJOs Transaktionsfunktionen hinzugefügt werden. Spring unterstützt sowohl das programmatische als auch das deklarative Transaktionsmanagement. EJBs erfordern einen Anwendungsserver, aber das Spring-Transaktionsmanagement kann implementiert werden, ohne dass ein Anwendungsserver erforderlich ist.
Lokale vs. globale Transaktionen
Lokale Transaktionen sind spezifisch für eine einzelne Transaktionsressource wie eine JDBC-Verbindung, während globale Transaktionen mehrere Transaktionsressourcen wie Transaktionen in einem verteilten System umfassen können.
Die lokale Transaktionsverwaltung kann in einer zentralisierten Computerumgebung nützlich sein, in der sich Anwendungskomponenten und -ressourcen an einem einzigen Standort befinden und bei der Transaktionsverwaltung nur ein lokaler Datenmanager auf einem einzelnen Computer ausgeführt wird. Lokale Transaktionen sind einfacher zu implementieren.
Globales Transaktionsmanagement ist in einer verteilten Computerumgebung erforderlich, in der alle Ressourcen auf mehrere Systeme verteilt sind. In einem solchen Fall muss das Transaktionsmanagement sowohl auf lokaler als auch auf globaler Ebene erfolgen. Eine verteilte oder globale Transaktion wird über mehrere Systeme ausgeführt, und ihre Ausführung erfordert eine Koordination zwischen dem globalen Transaktionsmanagementsystem und allen lokalen Datenmanagern aller beteiligten Systeme.
Programmatisch vs. deklarativ
Spring unterstützt zwei Arten der Transaktionsverwaltung:
Programmatische Transaktionsverwaltung - Dies bedeutet, dass Sie die Transaktion mithilfe der Programmierung verwalten müssen. Das gibt Ihnen extreme Flexibilität, aber es ist schwierig zu warten.
Deklarative Transaktionsverwaltung - Dies bedeutet, dass Sie die Transaktionsverwaltung vom Geschäftscode trennen. Sie verwenden nur Anmerkungen oder eine XML-basierte Konfiguration, um die Transaktionen zu verwalten.
Das deklarative Transaktionsmanagement ist dem programmatischen Transaktionsmanagement vorzuziehen, obwohl es weniger flexibel ist als das programmatische Transaktionsmanagement, mit dem Sie Transaktionen über Ihren Code steuern können. Als eine Art Querschnittsthema kann das deklarative Transaktionsmanagement mit dem AOP-Ansatz modularisiert werden. Spring unterstützt das deklarative Transaktionsmanagement über das Spring AOP-Framework.
Spring Transaction Abstracts
Der Schlüssel für die Spring-Transaktionsabstraktion wird von der Schnittstelle org.springframework.transaction.PlatformTransactionManager wie folgt definiert:
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition);
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | TransactionStatus getTransaction(TransactionDefinition definition) Diese Methode gibt eine aktuell aktive Transaktion zurück oder erstellt eine neue, entsprechend dem angegebenen Weitergabeverhalten. |
2 | void commit(TransactionStatus status) Diese Methode schreibt die angegebene Transaktion hinsichtlich ihres Status fest. |
3 | void rollback(TransactionStatus status) Diese Methode führt ein Rollback der angegebenen Transaktion durch. |
Die TransactionDefinition ist die Kernschnittstelle der Transaktionsunterstützung in Spring und wird wie folgt definiert:
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | int getPropagationBehavior() Diese Methode gibt das Ausbreitungsverhalten zurück. Spring bietet alle von EJB CMT bekannten Optionen zur Transaktionsweitergabe. |
2 | int getIsolationLevel() Diese Methode gibt den Grad zurück, in dem diese Transaktion von der Arbeit anderer Transaktionen isoliert ist. |
3 | String getName() Diese Methode gibt den Namen dieser Transaktion zurück. |
4 | int getTimeout() Diese Methode gibt die Zeit in Sekunden zurück, in der die Transaktion abgeschlossen sein muss. |
5 | boolean isReadOnly() Diese Methode gibt zurück, ob die Transaktion schreibgeschützt ist. |
Nachfolgend sind die möglichen Werte für die Isolationsstufe aufgeführt -
Sr.Nr. | Isolierung & Beschreibung |
---|---|
1 | TransactionDefinition.ISOLATION_DEFAULT Dies ist die Standardisolationsstufe. |
2 | TransactionDefinition.ISOLATION_READ_COMMITTED Zeigt an, dass fehlerhafte Lesevorgänge verhindert werden. Es können nicht wiederholbare Lesevorgänge und Phantom-Lesevorgänge auftreten. |
3 | TransactionDefinition.ISOLATION_READ_UNCOMMITTED Zeigt an, dass Dirty Reads, nicht wiederholbare Reads und Phantom Reads auftreten können. |
4 | TransactionDefinition.ISOLATION_REPEATABLE_READ Zeigt an, dass fehlerhafte und nicht wiederholbare Lesevorgänge verhindert werden. Phantom Reads können auftreten. |
5 | TransactionDefinition.ISOLATION_SERIALIZABLE Zeigt an, dass Dirty Reads, nicht wiederholbare Reads und Phantom Reads verhindert werden. |
Nachfolgend sind die möglichen Werte für Ausbreitungstypen aufgeführt:
Sr.Nr. | Vermehrung & Beschreibung |
---|---|
1 | TransactionDefinition.PROPAGATION_MANDATORY Unterstützt eine aktuelle Transaktion; löst eine Ausnahme aus, wenn keine aktuelle Transaktion vorhanden ist. |
2 | TransactionDefinition.PROPAGATION_NESTED Wird innerhalb einer verschachtelten Transaktion ausgeführt, wenn eine aktuelle Transaktion vorhanden ist. |
3 | TransactionDefinition.PROPAGATION_NEVER Unterstützt keine aktuelle Transaktion; löst eine Ausnahme aus, wenn eine aktuelle Transaktion vorhanden ist. |
4 | TransactionDefinition.PROPAGATION_NOT_SUPPORTED Unterstützt keine aktuelle Transaktion; lieber immer nicht transaktional ausführen. |
5 | TransactionDefinition.PROPAGATION_REQUIRED Unterstützt eine aktuelle Transaktion; erstellt eine neue, wenn keine vorhanden ist. |
6 | TransactionDefinition.PROPAGATION_REQUIRES_NEW Erstellt eine neue Transaktion und setzt die aktuelle Transaktion aus, falls vorhanden. |
7 | TransactionDefinition.PROPAGATION_SUPPORTS Unterstützt eine aktuelle Transaktion; wird nicht transaktional ausgeführt, wenn keine vorhanden ist. |
8 | TransactionDefinition.TIMEOUT_DEFAULT Verwendet das Standardzeitlimit des zugrunde liegenden Transaktionssystems oder keines, wenn Zeitlimits nicht unterstützt werden. |
Die TransactionStatus- Schnittstelle bietet eine einfache Möglichkeit für Transaktionscode, die Transaktionsausführung zu steuern und den Transaktionsstatus abzufragen.
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | boolean hasSavepoint() Diese Methode gibt zurück, ob diese Transaktion intern einen Sicherungspunkt enthält, dh als verschachtelte Transaktion basierend auf einem Sicherungspunkt erstellt wurde. |
2 | boolean isCompleted() Diese Methode gibt zurück, ob diese Transaktion abgeschlossen ist, dh ob sie bereits festgeschrieben oder zurückgesetzt wurde. |
3 | boolean isNewTransaction() Diese Methode gibt true zurück, falls die aktuelle Transaktion neu ist. |
4 | boolean isRollbackOnly() Diese Methode gibt zurück, ob die Transaktion als Nur-Rollback markiert wurde. |
5 | void setRollbackOnly() Diese Methode legt die Transaktion als Nur-Rollback fest. |