Spring Boot中的@EnableTransactionManagement

85
在Spring Boot中,@EnableTransactionManagement是否必须?经过我的研究,有些人认为你不需要它,因为Spring Boot已经默认启用了它,而另一些人则说你必须显式地使用它。那么它到底是怎样的呢?
6个回答

96

可能你也在使用Spring Data。调用Spring Data仓库时,默认情况下会被事务包围,即使没有@EnableTransactionManagement。如果Spring Data发现已经存在的事务,则会重复使用该事务,否则将创建一个新事务。

然而,在你自己的代码中使用@Transactional注解,只有在激活了@EnableTransactionManagement(或以其他方式配置了事务处理)时才会被评估。

您可以通过向application.properties添加以下属性来轻松跟踪事务行为:

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

(参见在日志中显示Spring事务


44
根据https://spring.io/guides/gs/managing-transactions/的指南,Spring Boot将检测classpath中的spring-jdbc和h2,并会自动为您创建一个DataSource和JdbcTemplate。由于这样的基础设施现在可用且没有专用配置,因此还将为您创建一个DataSourceTransactionManager:这是拦截@Transactional注释方法的组件。您还可以使用spring-boot-starter-actuator来列出上下文中创建的bean,并可以找到名为“transactionManager”的bean。

11
所以答案是:如果您的类路径上有spring-jdbc,那么您就不需要@EnableTransactionManagement,对吗? - Dirk
2
只有在你的配置类中使用了@EnableAutoConfiguration,否则它将无法工作。 - kekko12
13
@EnableAutoConfiguration śėĮÁĒĪ @SpringBootApplication ś∑ĽŚä†ÁöĄ„Äā - Alex78191

34

这篇文章有一点旧,但我在查找它时之前给出的答案并不直接。

@EnableTransactionManagement 在Spring Boot中是可选的,只要在类路径中发现了spring-data*spring-tx。它是如何工作的?具体如下:

Spring Boot在类路径中添加了一个spring-boot-autoconfigure.jar。进入 META-INF 的 spring.factories 文件,您会看到 org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration 这个条目。 这将为您初始化事务自动配置。

请注意,该类有以下几行代码:(摘录)

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

查看TransactionAutoConfiguration以了解它是否启用了事务支持,如果 PlatformTransactionManager 在类路径中可用,则会启用。 EnableTransactionManagementConfiguration 也在那里配置。


只有在您的配置类中使用@EnableAutoConfiguration才是这样吗?所以这不是真的吗? - Alex78191
9
@EnableAutoConfiguration 是由 @SpringBootApplication 添加的。 - v.ladynev

16

5

@EnableTransactionManagement根据类路径中添加的依赖项进行有条件的打开/关闭。如果我们使用spring data jpa starter,则会打开它。


4
在类org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration中,存在这样的代码(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 {

    }

默认情况下,spring.aop.proxy-target-class=true,默认启用CGLIB代理。如果您想使用JDK代理,请设置spring.aop.proxy-target-class=false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接