Spring Boot中的@EnableTransactionManagement

时间:2016-11-21 15:48:31

标签: spring-boot transactions

Spring Boot需要@EnableTransactionManagement吗? 我做了一些研究。有些人说你不需要它,因为Spring Boot已经启用它,其他人说你必须明确地使用它。那怎么回事?

6 个答案:

答案 0 :(得分:40)

您可能也在使用Spring Data。默认情况下,对Spring Data存储库的调用由事务包围,即使没有@EnableTransactionManagement也是如此。如果Spring Data找到现有事务,则将重用现有事务,否则将创建新事务。

但是,只有在激活@EnableTransactionManagement(或以其他方式配置事务处理)时才会评估您自己代码中的@Transactional注释。

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

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

(见Showing a Spring transaction in log

答案 1 :(得分:24)

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

Spring Boot将检测类路径和h2上的spring-jdbc,并自动为您创建一个DataSource和一个JdbcTemplate 。由于此类基础结构现在可用且您没有专用配置,因此还将为您创建 DataSourceTransactionManager :这是拦截@Transactional注释方法的组件。

您还可以使用 spring-boot-starter-actuator 列出在您的上下文中创建的bean,您将找到它

bean":" transactionManager"

答案 2 :(得分:7)

很老的帖子,但是当我搜索时,先前给出的答案并不是直截了当的。

如果在类路径中找到 spring-data * spring-tx ,则在Spring启动时

@EnableTransactionManagement 可选。这个怎么运作?如下:

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以查看它是否支持transacton支持。 EnableTransactionManagementConfiguration也在那里配置。

答案 3 :(得分:2)

@EnableTransactionManagement默认为启用,请注意:https://github.com/jkubrynski/spring-boot/commit/9d219ef7a004c58a88bbbef82a520a22961c9402

答案 4 :(得分:0)

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

答案 5 :(得分:0)

根据我们添加到类路径中的依赖项jar,有条件地打开/关闭

@EnableTransactionManagement。如果我们使用spring data jpa启动器,则会将其打开。