Spring Boot 中的@EnableTransactionManagement

Posted

技术标签:

【中文标题】Spring Boot 中的@EnableTransactionManagement【英文标题】:@EnableTransactionManagement in Spring Boot 【发布时间】:2017-04-05 01:55:18 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

(见Showing a Spring transaction in log)

【讨论】:

【参考方案2】:

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

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

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

bean": "事务管理器"

【讨论】:

所以答案是:如果你的类路径中有 spring-jdbc,你就不需要@EnableTransactionManagement,对吧? 仅当您的配置类中有 @EnableAutoConfiguration 时。否则将无法正常工作。 @kekko12 @EnableAutoConfiguration is added by @SpringBootApplication【参考方案3】:

有点旧的帖子,但是当我搜索它时,之前给出的答案并不直截了当。

@EnableTransactionManagement 在 Spring boot 中是 可选,前提是在类路径中找到 spring-data*spring-tx。这个怎么运作?如下:

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

请注意,该类有以下几行:(sn-p)

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

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

【讨论】:

only if you have @EnableAutoConfiguration in your configuration class though 所以这不是真的? @Alex78191 @EnableAutoConfiguration@SpringBootApplication添加【参考方案4】:

@EnableTransactionManagement 默认开启,见:https://github.com/jkubrynski/spring-boot/commit/9d219ef7a004c58a88bbbef82a520a22961c9402

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

@EnableTransactionManagement 根据我们在类路径中添加的依赖 jar 有条件地打开/关闭。如果我们使用 spring data jpa starter 它是打开的。

【讨论】:

以上是关于Spring Boot 中的@EnableTransactionManagement的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理

Spring Boot2 系列教程Spring Boot 中的静态资源配置

SpringBoot @Async 异步处理业务逻辑和发短信逻辑

内存数据库spring-boot中的h2

使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源

Spring Boot 实践折腾记:Spring Boot中的容器配置和SSL支持