Im Fall 1 wird @Transactional auf jede öffentliche Einzelmethode angewendet. Private und geschützte Methoden werden von Spring ignoriert.
Spring wendet die Annotation auf Klassenebene auf alle öffentlichen Methoden dieser Klasse an, die wir nicht mit @Transactional annotiert haben. Wenn wir die Annotation jedoch auf eine private oder geschützte Methode setzen, ignoriert Spring sie fehlerfrei.
In Fall 2 wird @Transactional nur auf Methode2 () angewendet, nicht auf Methode1 ()
Fall 1: - Aufrufen von Methode1 () -> Eine Transaktion wird gestartet. Wenn method1 () method2 () aufruft, wird keine neue Transaktion gestartet, da bereits eine vorhanden ist
Fall 2: - Aufrufen von Methode1 () -> Es wird keine Transaktion gestartet. Wenn method1 () method2 () aufruft, wird KEINE neue Transaktion gestartet. Dies liegt daran, dass @Transactional nicht funktioniert, wenn eine Methode aus derselben Klasse aufgerufen wird. Es würde funktionieren, wenn Sie method2 () aus einer anderen Klasse aufrufen würden.
Aus dem Federreferenzhandbuch :
Im Proxy-Modus (Standardeinstellung) werden nur externe Methodenaufrufe abgefangen, die über den Proxy eingehen. Dies bedeutet, dass der Selbstaufruf einer Methode innerhalb des Zielobjekts, die eine andere Methode des Zielobjekts aufruft, zur Laufzeit nicht zu einer tatsächlichen Transaktion führt, selbst wenn die aufgerufene Methode mit @Transactional markiert ist. Außerdem muss der Proxy vollständig initialisiert sein, um das erwartete Verhalten bereitzustellen, sodass Sie sich in Ihrem Initialisierungscode, dh @PostConstruct, nicht auf diese Funktion verlassen sollten.