web-dev-qa-db-ja.com

Spring Bootの@EnableTransactionManagement

@EnableTransactionManagementはSpring Bootで必要ですか?私はいくつかの研究をしました。 Spring Bootで既に有効になっているため、不要だと言う人もいれば、明示的に使用する必要があると言う人もいます。それではどうですか?

37
jarosik

おそらくあなたもSpring Dataを使用しているでしょう。 Spring Dataリポジトリの呼び出しは、@ EnableTransactionManagementがなくても、デフォルトでトランザクションに囲まれています。 Spring Dataが既存のトランザクションを見つけると、既存のトランザクションが再利用されます。それ以外の場合は、新しいトランザクションが作成されます。

ただし、独自のコード内の@Transactionalアノテーションは、@ EnableTransactionManagementがアクティブになっている(または他の方法でトランザクションを構成している)場合にのみ評価されます。

Application.propertiesに次のプロパティを追加すると、トランザクションの動作を簡単に追跡できます。

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

ログにSpringトランザクションを表示 を参照)

48
Tom

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

Spring Boot willクラスパスとh2でspring-jdbcを検出し、DataSourceとJdbcTemplateを自動的に作成します。このようなインフラストラクチャが利用可能になり、専用の構成がないため、DataSourceTransactionManagerも作成されます:これは@Transactionalアノテーション付きメソッドをインターセプトするコンポーネントです。

spring-boot-starter-actuatorを使用して、コンテキストで作成されたBeanをリストすることもできます。

bean ":" transactionManager "

28
mmgc84

少し古い記事ですが、以前に与えられた答えは、私がそれを探していたとき、簡単ではありませんでした。

@EnableTransactionManagementは、spring-data *またはspring-txがクラスパスにある場合、Springブートではオプションです。使い方?以下のように:

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もそこに設定されています。

11
Karthik R

@EnableTransactionManagementはデフォルトでオンになっています。以下を参照してください。 https://github.com/jkubrynski/spring-boot/commit/9d219ef7a004c58a88bbbef82a520a22961c9402

6
William He

クラス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を設定します。

1
herseus