17 Spring Transaction Management

Das Transaktionsmanagement ist ein zentraler Aspekt moderner Unternehmensanwendungen, und Spring bietet hierfür umfangreiche Unterstützung. Transaktionen gewährleisten die Integrität der Datenbearbeitung und sind essenziell für Anwendungen, in denen mehrere Datenbankoperationen als eine einzige, atomare Einheit durchgeführt werden müssen.

17.1 Kernkonzepte des Transaktionsmanagements in Spring

Spring’s Transaktionsmanagement abstrahiert die zugrundeliegenden Transaktionsmanagement-Mechanismen der verschiedenen Datenbanktechnologien (wie JDBC, JPA, Hibernate) und bietet ein konsistentes Programmiermodell für die Deklaration von Transaktionen.

17.1.1 Deklaratives Transaktionsmanagement

Das deklarative Transaktionsmanagement ist der bevorzugte Ansatz in Spring. Es verwendet Annotationen (hauptsächlich @Transactional) oder XML-Konfiguration, um die Transaktionsgrenzen zu definieren. Dieser Ansatz ermöglicht es Entwicklern, die Transaktionslogik von der Geschäftslogik zu trennen, wodurch der Code sauberer und wartbarer wird.

17.1.2 Programmatisches Transaktionsmanagement

Obwohl weniger verbreitet, ermöglicht Spring auch das programmatische Transaktionsmanagement, bei dem Entwickler die Transaktionslogik direkt im Code implementieren. Dieser Ansatz bietet mehr Flexibilität, ist aber auch fehleranfälliger und führt zu mehr Boilerplate-Code.

17.2 Die @Transactional Annotation

Die @Transactional Annotation ist das Herzstück des deklarativen Transaktionsmanagements in Spring. Sie kann auf Klassen- oder Methodenebene verwendet werden, um die umschließenden Operationen in einer Transaktion auszuführen. Spring kümmert sich automatisch um das Erstellen, Commiten oder Rollback der Transaktion basierend auf dem Erfolg oder Misserfolg der umschlossenen Operationen.

17.2.1 Eigenschaften von @Transactional

17.2.2 Beispiel

@Transactional(readOnly = true)
public class UserService {

    public User findUserById(Long id) {
        // Findet einen Benutzer, die Operation ist schreibgeschützt
    }

    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public void updateUser(User user) {
        // Aktualisiert einen Benutzer, startet bei Bedarf eine neue Transaktion
    }
}

In diesem Beispiel ist findUserById schreibgeschützt, während updateUser eine neue Transaktion startet, selbst wenn bereits eine Transaktion läuft.

17.3 Transaktionsmanagement-Infrastruktur

Spring’s Transaktionsmanagement wird durch eine Reihe von Abstraktionen und Klassen unterstützt, wie PlatformTransactionManager, die für verschiedene Datenquellentypen spezifische Implementierungen hat (z.B. DataSourceTransactionManager für JDBC).