web-dev-qa-db-fra.com

@EnableTransactionManagement in Spring Boot

@EnableTransactionManagement est-il requis dans Spring Boot? J'ai effectué des recherches. Certaines personnes disent que vous n'en avez pas besoin, comme Spring Boot l'a déjà activé, d'autres disent que vous devez l'utiliser explicitement. Alors c'est comment?

27
jarosik

Vous utilisez probablement aussi Spring Data. Les appels sur les référentiels Spring Data sont par défaut entourés d'une transaction, même sans @EnableTransactionManagement. Si Spring Data trouve une transaction existante, celle-ci sera réutilisée, sinon une nouvelle transaction est créée.

Les annotations @Transactional dans votre propre code ne sont toutefois évaluées que lorsque @EnableTransactionManagement est activé (ou qu'une transaction configurée traite d'une autre manière).

Vous pouvez facilement suivre le comportement des transactions en ajoutant la propriété suivante à votre application.properties:

logging.level.org.springframework.transaction.interceptor=TRACE

(voir Affichage d'une transaction Spring dans le journal )

31
Tom

Selon> https://spring.io/guides/gs/managing-transactions/

Spring Boot détectera spring-jdbc sur le chemin de classe et h2 et créera automatiquement un DataSource et un JdbcTemplate. Comme cette infrastructure est maintenant disponible et que vous n'avez pas de configuration dédiée, un DataSourceTransactionManager sera également créé pour vous: il s'agit du composant qui intercepte la méthode annotée @Transactional.

Vous pouvez aussi utiliser spring-boot-starter-actuator pour lister vos beans créés dans votre contexte et vous les trouverez

bean ":" transactionManager "

22
mmgc84

Petit article ancien mais les réponses données précédemment ne sont pas simples quand je le cherchais.

@EnableTransactionManagement est optionnel dans Spring Boot, à condition que spring-data * ou spring-tx se trouve dans classpath. Comment ça marche? Comme ci-dessous:

Spring Boot ajoute un fichierspring-boot-autoconfigure.jardans le chemin d'accès aux classes. Accédez au fichier spring.factories du META-INF et vous pourrez y voir l'entrée org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration. Ceci initialise la configuration automatique de la transaction pour vous.

Notez que la classe a les lignes suivantes: (extrait)

@Configuration
@ConditionalOnClass({PlatformTransactionManager.class})
@AutoConfigureAfter({JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, Neo4jDataAutoConfiguration.class})
@EnableConfigurationProperties({TransactionProperties.class})
public class TransactionAutoConfiguration {
..
}

Examinez TransactionAutoConfiguration pour voir s'il active la prise en charge de transacton si PlatformTransactionManager est disponible dans classpath. EnableTransactionManagementConfiguration est également configuré ici.

5
Karthik R

@EnableTransactionManagement est activé par défaut, voir que: https://github.com/jkubrynski/spring-boot/commit/9d219ef7a004c58a88bbbef82a520a22961c9402

1
William He

Dans la classe org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, il existe un tel code (Spring Boot 1.5+):

    @Configuration
    @EnableTransactionManagement(proxyTargetClass = false)
    @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", matchIfMissing = false)
    public static class JdkDynamicAutoProxyConfiguration {

    }

    @Configuration
    @EnableTransactionManagement(proxyTargetClass = true)
    @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = true)
    public static class CglibAutoProxyConfiguration {

    }

La valeur par défaut est spring.aop.proxy-target-class=true, ce qui active le proxy CGLIB par défaut . Si vous souhaitez utiliser le proxy JDK, définissez plutôt spring.aop.proxy-target-class=false.

0
herseus