Ich möchte die Verwendung einer Federtransaktion mit Propagationsunterstützungen verstehen. Die Java-Dokumente erwähnen, dass wenn die Methode, die @Transactional(propagation = Propagation.SUPPORTS)
hat, innerhalb einer Transaktion aufgerufen wird, die Transaktion unterstützt, aber wenn keine Transaktion existiert, wird die Methode nicht-transaktional ausgeführt.
Ist das nicht schon das Verhalten von Frühjahrstransaktionen unabhängig von Propagation.SUPPORTS
?
Im obigen Codebeispiel, unabhängig davon, ob methodWithSupportsTx()
@Transactional(propagation = Propagation.SUPPORTS)
Annotation hat, würde es in einer Transaktion ausgeführt werden, abhängig davon, ob methodWithRequiredTx()
@Transactional
Annotation hat, richtig?
Was ist also der Bedarf / die Verwendung eines Ausbreitungsniveaus SUPPORTS?
Von javadoc :
Hinweis: Für Transaktionsmanager mit Transaktionssynchronisierung unterscheidet sich PROPAGATION_SUPPORTS geringfügig von keiner Transaktion, da es einen Transaktionsbereich definiert, für den die Synchronisierung gelten soll. Daher werden dieselben Ressourcen (JDBC-Verbindung, Ruhezustand usw.) für den gesamten angegebenen Bereich freigegeben. Beachten Sie, dass dies von der tatsächlichen Synchronisationskonfiguration des Transaktionsmanagers abhängt.
Das bedeutet also, dass zum Beispiel mehrere Aufrufe von Hibernats SessionFactory.getCurrentSession()
in methodWithSupportsTx()
die gleiche Sitzung zurückgeben würden.
Eine erforderliche Transaktion erstellt eine neue Transaktion, wenn keine existiert. Daher würde eine neue Transaktion vorgenommen werden, wenn Sie serviceBean.methodWithSupportsTx () aufrufen. Wenn Ihre Methode wirklich transaktional ist, sehen Sie einen Fehler von Frühling, wenn keine Transaktion existiert.
Tags und Links spring transactions propagation