Wenn Sie eine Methode ohne @Transactional
innerhalb eines Transaktionsblocks aufrufen , wird die übergeordnete Transaktion mit der neuen Methode fortgesetzt. Es wird dieselbe Verbindung von der übergeordneten Methode (mit @Transactional
) und alle in der aufgerufenen Methode verursachten Ausnahmen verwendet (ohne @Transactional
wird die Transaktion wie in der Transaktionsdefinition konfiguriert zurückgesetzt.
Wenn Sie eine Methode mit einer @Transactional
Annotation von einer Methode @Transactional
innerhalb derselben Instanz aufrufen , hat das Transaktionsverhalten der aufgerufenen Methoden keine Auswirkungen auf die Transaktion. Wenn Sie jedoch eine Methode mit einer Transaktionsdefinition von einer anderen Methode mit einer Transaktionsdefinition aufrufen und diese sich in verschiedenen Instanzen befindet, folgt der Code in der aufgerufenen Methode den in der aufgerufenen Methode angegebenen Transaktionsdefinitionen.
Weitere Informationen finden Sie im Abschnitt Deklarative Transaktionsverwaltung der Dokumentation von Frühjahrstransaktionen .
Das deklarative Spring-Transaktionsmodell verwendet den AOP-Proxy. Daher ist der AOP-Proxy für die Erstellung der Transaktionen verantwortlich. Der AOP-Proxy ist nur aktiv, wenn die Methoden mit in der Instanz von außerhalb der Instanz aufgerufen werden.
will follow the transaction definitions given in the called method
. Wenn der Aufruf jedoch von derselben Objektinstanz stammt, hat dies keine Auswirkungen, da der Aufruf nicht über die aop-Proxys weitergegeben wird, die für die Transaktionswartung verantwortlich sind.@Transactional
Definition von einem anderen Objekt / einer anderen Instanz aufrufen@Transactional
, folgt die aufgerufene Methode der eigenen Transaktionsdefinition, obwohl die aufrufende Methode andere Attribute hat.Das hängt von einem Ausbreitungsgrad ab . Hier sind alle möglichen Pegelwerte .
Wenn beispielsweise eine Weitergabeebene verschachtelt ist, wird eine aktuelle Transaktion " angehalten " und eine neue Transaktion erstellt ( Hinweis: Die tatsächliche Erstellung einer verschachtelten Transaktion funktioniert nur bei bestimmten Transaktionsmanagern ).
Die Standardausbreitungsstufe (was Sie "Verhalten" nennen) ist ERFORDERLICH . Wenn eine "innere" Methode aufgerufen wird, die eine
@Transactional
Anmerkung enthält (oder deklarativ über XML abgewickelt wird), wird sie innerhalb derselben Transaktion ausgeführt , z. B. wird "nichts Neues" erstellt.quelle
@Transactional markiert die Transaktionsgrenze (Anfang / Ende), aber die Transaktion selbst ist an den Thread gebunden. Sobald eine Transaktion gestartet wird, wird sie über Methodenaufrufe verteilt, bis die ursprüngliche Methode zurückgegeben wird und die Transaktion festgeschrieben / zurückgesetzt wird.
Wenn eine andere Methode mit einer @ Transactional-Annotation aufgerufen wird, hängt die Propagation vom Propagation-Attribut dieser Annotation ab.
quelle
Die innere Methode wirkt sich auf die äußere Methode aus, wenn die innere Methode nicht mit @Transactional versehen ist.
Falls die innere Methode auch mit @Transactional with kommentiert ist, geschieht
REQUIRES_NEW
Folgendes.Die innere Methode ist mit
REQUIRES_NEW
einer RuntimeException versehen und löst eine RuntimeException aus, sodass die Transaktion auf Rollback gesetzt wird, die äußere Transaktion jedoch nicht beeinflusst wird. Die äußere Transaktion wird beim Start der inneren Transaktion PAUSED und nach Abschluss der inneren Transaktion fortgesetzt. Sie werden unabhängig voneinander ausgeführt, sodass die äußere Transaktion möglicherweise erfolgreich festgeschrieben wird.quelle