Von Frühling Referenzen Dokumentation
Frühling empfiehlt, nur konkrete Klassen (und Methoden der konkreten Klassen) mit der @Transactional Annotation annotieren, als Schnittstellen zu annotieren gegenüber. Sie können die @Transactional Annotation auf eine Schnittstelle (oder eine Interface-Methode) platzieren, aber das funktioniert nur so, wie Sie es erwarten würden, wenn Sie interface-basierte Proxies verwenden. Die Tatsache, dass Java Annotationen nicht von Interfaces geerbt werden, bedeutet, dass wenn Sie klassenbasierte Proxies (proxy-target-class = "true") oder den webbasierten Aspekt (mode = "aspectj") verwenden, dann Transaktionseinstellungen werden von der Proxy- und Webinfrastruktur nicht erkannt, und das Objekt wird nicht in einen Transaktions-Proxy eingebunden, was ausgesprochen schlecht wäre.
Im Proxy-Modus (Standardeinstellung) werden nur externe Methodenanrufe, die über den Proxy eingehen, abgefangen.Dies bedeutet, dass Selbstaufruf, dh eine Methode innerhalb des Zielobjekts, die eine andere Methode des Zielobjekts aufruft, nicht zur tatsächlichen Transaktion zur Laufzeit führt, auch wenn die aufgerufene Methode mit @Transactional gekennzeichnet ist.
Dann ist mit @Transaction das Standardverhalten, dass jede RuntimeException Rollback auslöst, und alle aktivierten Exceptions nicht. Dann wird Ihre Transaktion für alle RuntimeException zurückgesetzt und für die ausgewählte Exception geworfen.
versuchen Sie es in Ihrer Anwendung, ich nehme an, Sie verstehen, was '@ Transactional' tut. –
@ user3404577 Können Sie uns Ihren Snippet-Code zeigen? – Skizzo
@ user3404577 Wo ist enthalten ** yearEndProcess ** Methode? Die Klasse, die yearEndProcess enthält, ist ein Dienst, eine Komponente oder ein anderes adn implementiert schließlich einige Schnittstellen? – Skizzo