@Transactional (Propagation = Propagation.REQUIRED)


Antworten:


65

Wenn die Propagierungseinstellung PROPAGATION_REQUIRED ist, wird für jede Methode, auf die die Einstellung angewendet wird, ein logischer Transaktionsbereich erstellt. Jeder dieser logischen Transaktionsbereiche kann den Rollback-Status einzeln bestimmen, wobei ein äußerer Transaktionsbereich logisch unabhängig vom inneren Transaktionsbereich ist. Im Falle eines Standardverhaltens von PROPAGATION_REQUIRED werden natürlich alle diese Bereiche derselben physischen Transaktion zugeordnet. Ein im inneren Transaktionsbereich festgelegter Nur-Rollback-Marker wirkt sich also auf die Chance der äußeren Transaktion aus, tatsächlich ein Commit durchzuführen (wie Sie es erwarten würden).

Geben Sie hier die Bildbeschreibung ein

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html


166

Wenn Sie eine Erklärung für Laien benötigen, die über die in den Spring Docs angegebenen hinausgeht

Betrachten Sie diesen Code ...

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

Wenn doSomething () aufgerufen wird, weiß es, dass es vor der Ausführung eine Transaktion in der Datenbank starten muss. Wenn der Aufrufer dieser Methode bereits eine Transaktion gestartet hat, verwendet diese Methode dieselbe physische Transaktion für die aktuelle Datenbankverbindung.

Diese @TransactionalAnmerkung bietet eine Möglichkeit, Ihrem Code bei der Ausführung mitzuteilen, dass eine Transaktion erforderlich ist. Es wird nicht ohne ausgeführt, daher können Sie in Ihrem Code davon ausgehen, dass Sie keine unvollständigen Daten in Ihrer Datenbank haben oder im Falle einer Ausnahme etwas bereinigen müssen.

Das Transaktionsmanagement ist ein ziemlich kompliziertes Thema, daher ist diese vereinfachte Antwort hoffentlich hilfreich


8
Wenn jemand interessiert ist, habe ich eine ähnliche Antwort für Laien
Brad,

Wenn die Proxy-basierte Konfiguration zum Deklarieren und Zugreifen auf die DAO-Schicht verwendet wird, muss die Methode in der DAO-Klasse auch mit @Transactional kommentiert werden.
Kurapika

Wenn Sie @TransactionalIhrer Serviceschicht hinzugefügt haben , müssen Sie nicht mehr @Transactionalzu den DAO-Methoden hinzufügen , die innerhalb dieser Transaktion aufgerufen werden.
Brad

Wenn doSomething()eine andere verschachtelte Methode ohne @transactional aufgerufen wird, gilt dieselbe Transaktion auch für diese aufrufende Methode?
Thisarattr

Ja, solange derselbe Thread zum Ausführen einer verschachtelten Methode verwendet wird (dh Sie erstellen keinen neuen Thread explizit). Dies liegt daran, dass Spring-Transaktionen mithilfe von ThreadLocal-Variablen an den aktuellen Thread gebunden sind
Brad,

15

Wenn Sie in Spring-Anwendungen die annotationsbasierte Transaktionsunterstützung aktivieren <tx:annotation-driven/>und eine Klasse / Methode mit @Transactional (propagation = Propagation.REQUIRED) kommentieren und annotieren, startet das Spring-Framework eine Transaktion und führt die Methode aus und schreibt die Transaktion fest. Wenn eine RuntimeException aufgetreten ist, wird die Transaktion zurückgesetzt.

Tatsächlich ist Propagation = Propagation.REQUIRED die Standardausbreitungsstufe, die Sie nicht explizit erwähnen müssen.

Für weitere Informationen: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.