web-dev-qa-db-fra.com

Comment puis-je déterminer si je suis dans une transaction au printemps?

J'ai un problème de persistance dans un service de printemps. Un Rest-Controller R reçoit une demande et appelle un service S de manière complexe via certaines couches de code. La méthode de service dans S déclare une transaction; ce devrait être la première fois qu'une transaction devrait être lancée. Mais le service se comporte comme si une transaction avait déjà été démarrée auparavant et que certains de mes objets de données feraient partie de la session (ce qu'ils ne doivent pas faire). Comment puis-je déterminer si une transaction est déjà active? J'ai essayé d'injecter EntityManager et/ou JpaTransactionManager; mais les deux semblent être d'aucune aide.

Comment puis-je vérifier si je suis dans une transaction ou non?

Je veux en être sûr avant de partir à la recherche de suspects potentiels.

6
Uwe Allner

Vous pouvez vérifier si la transaction est active en utilisant TransactionSynchronizationManager.isActualTransactionActive(). Mais vous devriez l'appeler avant l'exécution d'une méthode de service.

Aussi, vous pouvez obtenir le statut de la transaction en cours en utilisant 

TransactionStatus status = TransactionAspectSupport.currentTransactionStatus();

En outre, un bon point pour vous est de permettre la journalisation des transactions.

log4j.logger.org.hibernate.transaction=DEBUG,R
log4j.logger.org.springframework.transaction=DEBUG,R
14
Mykola Yashchenko

Vous pouvez utiliser

org.springframework.transaction.support.TransactionSynchronizationManager#isActualTransactionActive
0
Pio Ko