Spring @Transactional wird sowohl als dynamischer Jdk-Proxy als auch als Aspekt angewendet.

Ich bin dabei, deklarative Spring-Transaktionen über die @ Transactional-Annotation zu einem vorhandenen Java-Projekt hinzuzufügen.

Wenn ich auf ein Problem gestoßen bin (das nichts mit dieser Frage zu tun hat), habe ich die vollständige Debug-Protokollierung aktiviert. Merkwürdigerweise ist mir folgendes aufgefallen:

17:47:27,834 DEBUG HibernateTransactionManager:437 - Found thread-bound Session [org.hibernate.impl.SessionImpl@10ed8a8e] for Hibernate transaction
17:47:27,845 DEBUG HibernateTransactionManager:470 - Participating in existing transaction
17:47:27,865 DEBUG AnnotationTransactionAttributeSource:106 - Adding transactional method 'updateUserProfile' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
17:47:27,875 DEBUG AnnotationTransactionAspect:321 - Skipping transactional joinpoint [se.myservice.UserService.updateUserProfile] because no transaction manager has been configured

Nach einigem Debuggen stellte ich fest, dass die ersten drei Protokolleinträge, in denen angegeben wird, dass eine threadgebundene Sitzung gefunden wurde und diese Transaktion verwendet wird, von einem JdkDynamicAopProxy in meiner UserService-Klasse erstellt wurden.

Die letzte Protokollmeldung sieht jedoch alarmierend aus. Es wird an einem Verknüpfungspunkt vor der Ausführung der Methode aufgerufen. Bei der Suche nach AnnotationTransactionAspect in der Quelle wird diese Meldung ausgegeben, wenn kein Transaktionsmanager festgelegt wurde. In diesem Fall führt Spring keine Abhängigkeitsinjektion für diesen Aspekt durch.

s sieht für mich so aus, als würden zwei verschiedene "Stile" von Transaktionen angewendet: der dynamische Proxy UND der Aspekt. Die einzige transaktionsbezogene Konfiguration, die ich habe, ist:

<tx:annotation-driven transaction-manager="txManager" />

Wir verwenden AspectJ im Projekt, aber in meiner aop.xml ist kein AnnotationTransactionAspect-Aspekt registriert. Wir verwenden Spring 3.0.2.RELEASE.

Sollte mich das alarmieren? Registriert Spring diesen Aspekt für mich? Soll ich nicht @ verwendannotation-driven bei Verwendung von AspectJ?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage