555 Stimmen

Spring @Transactional - Isolierung, Vermehrung

Kann jemand erklären, was Isolierung & Ausbreitung Parameter sind für in der @Transactional Annotation anhand eines realen Beispiels?

Vor allem, wann und warum ich die Standardwerte ändern sollte.

26voto

AngerClown Punkte 6001

Sie wollen fast nie die Read Uncommited denn es ist nicht wirklich ACID willfährig. Read Commmited ist eine gute Ausgangsposition. Repeatable Read wird wahrscheinlich nur in Berichterstattungs-, Rollup- oder Aggregations-Szenarien benötigt. Beachten Sie, dass viele DBs, einschließlich Postgres, Repeatable Read nicht unterstützen, Sie müssen Serializable stattdessen. Serializable ist nützlich für Dinge, von denen Sie wissen, dass sie völlig unabhängig von allem anderen geschehen müssen; stellen Sie sich das so vor synchronized in Java. Serializable geht Hand in Hand mit REQUIRES_NEW Ausbreitung.

Ich benutze REQUIRES für alle Funktionen, die UPDATE- oder DELETE-Abfragen ausführen, sowie für Funktionen auf "Service"-Ebene. Für Funktionen auf DAO-Ebene, die nur SELECTs ausführen, verwende ich SUPPORTS der an einem TX teilnimmt, wenn ein solcher bereits gestartet ist (d.h. von einer Dienstfunktion aus aufgerufen wird).

16voto

Gladwin Burboz Punkte 3509

Transaction Isolation und Transaction Propagation sind zwar verwandt, aber eindeutig zwei sehr unterschiedliche Konzepte. In beiden Fällen werden die Standardwerte an der Client-Grenzkomponente angepasst, entweder durch die Verwendung von Deklarative Transaktionsverwaltung ou Programmatische Transaktionsverwaltung . Einzelheiten zu den einzelnen Isolationsstufen und Ausbreitungsattributen finden Sie unter den nachstehenden Verweisen.

Transaktionsisolierung

Wie und wann wirken sich bei zwei oder mehr laufenden Transaktionen/Verbindungen zu einer Datenbank die von Abfragen in einer Transaktion vorgenommenen Änderungen auf die Abfragen in einer anderen Transaktion aus bzw. sind für diese sichtbar? Es geht auch darum, welche Art von Datenbanksperre verwendet wird, um Änderungen in dieser Transaktion von anderen Transaktionen zu isolieren und umgekehrt. Dies wird normalerweise von der Datenbank/Ressource implementiert, die an der Transaktion beteiligt ist.

.

Weitergabe von Vorgängen

In einer Unternehmensanwendung gibt es für jede beliebige Anfrage/Verarbeitung viele Komponenten, die für die Erledigung der Aufgabe erforderlich sind. Einige dieser Komponenten markieren die Grenzen (Anfang/Ende) einer Transaktion, die in der jeweiligen Komponente und ihren Unterkomponenten verwendet wird. Für diese Transaktionsgrenzen von Komponenten gibt Transaction Propogation an, ob die jeweilige Komponente an der Transaktion teilnimmt oder nicht und was passiert, wenn die aufrufende Komponente bereits eine Transaktion erstellt/gestartet hat oder nicht. Dies entspricht den Java EE Transaktionsattributen. Dies wird in der Regel durch den Client-Transaktions-/Verbindungsmanager implementiert.

Referenz:

10voto

NIrav Modi Punkte 4626

Ich habe gelaufen outerMethod , method_1 et method_2 mit verschiedenen Ausbreitungsmodi.

Nachfolgend ist die Ausgabe für verschiedene Ausbreitungsmodi dargestellt.

Äußere Methode

    @Transactional
    @Override
    public void outerMethod() {
        customerProfileDAO.method_1();
        iWorkflowDetailDao.method_2();
    }

Methode_1

    @Transactional(propagation=Propagation.MANDATORY)
    public void method_1() {
        Session session = null;
        try {
            session = getSession();
            Temp entity = new Temp(0l, "XXX");
            session.save(entity);
            System.out.println("Method - 1 Id "+entity.getId());
        } finally {
            if (session != null && session.isOpen()) {

            }
        }
    }

Methode_2

    @Transactional()
    @Override
    public void method_2() {
        Session session = null;
        try {
            session = getSession();
            Temp entity = new Temp(0l, "CCC");
            session.save(entity);
            int i = 1/0;
            System.out.println("Method - 2 Id "+entity.getId());
        } finally {
            if (session != null && session.isOpen()) {

            }
        }
    }
    • OuterMethod - Ohne Transaktion
    • Methode_1 - Propagation.MANDATORY) -
    • Methode_2 - Nur Transaktionskommentar
    • Ausgabe: method_1 löst die Ausnahme aus, dass keine Transaktion existiert

    • OuterMethod - Ohne Transaktion
    • Methode_1 - Nur Transaktionskommentar
    • Methode_2 - Ausbreitung.MANDATORY)
    • Ausgabe: Methode_2 löst die Ausnahme aus, dass keine Transaktion existiert
    • Ausgabe: method_1 hält den Datensatz in der Datenbank fest.

    • OuterMethod - Mit Transaktion
    • Methode_1 - Nur Transaktionskommentar
    • Methode_2 - Ausbreitung.MANDATORY)
    • Ausgabe: method_2 wird den Datensatz in der Datenbank aufrechterhalten.
    • Ausgabe: method_1 wird den Datensatz in der Datenbank aufrechterhalten. -- Hier Main Outer bestehende Transaktion für beide Methoden 1 und 2 verwendet

    • OuterMethod - Mit Transaktion
    • Methode_1 - Fortpflanzung.MANDATORY)
    • Methode_2 - Nur Transaktionsanmerkung und Ausnahmen
    • Ausgabe: kein Datensatz in der Datenbank vorhanden, d.h. Rollback erfolgt.

    • OuterMethod - Mit Transaktion
    • Methode_1 - Propagation.REQUIRES_NEW)
    • Methode_2 - Propagation.REQUIRES_NEW) und löst 1/0 Ausnahmen aus
    • Ausgabe: Methode_2 löst eine Ausnahme aus, so dass der Datensatz von Methode_2 nicht erhalten bleibt.
    • Ausgabe: method_1 hält den Datensatz in der Datenbank fest.
    • Ausgabe: Es gibt kein Rollback für Methode_1

2voto

Ankit Punkte 545

Wir können dies ergänzen:

@Transactional(readOnly = true)
public class Banking_CustomerService implements CustomerService {

    public Customer getDetail(String customername) {
        // do something
    }

    // these settings have precedence for this method
    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public void updateCustomer(Customer customer) {
        // do something
    }
}

0voto

Ankit Punkte 545

Sie können es so verwenden:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public EventMessage<ModificaOperativitaRapporto> activate(EventMessage<ModificaOperativitaRapporto> eventMessage) {
//here some transaction related code
}

Sie können dieses Ding auch benutzen:

public interface TransactionStatus extends SavepointManager {
    boolean isNewTransaction();
    boolean hasSavepoint();
    void setRollbackOnly();
    boolean isRollbackOnly();
    void flush();
    boolean isCompleted();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X