SpringBootのトランザクション管理アノテーション@EnableTransactionManagement



Spring Boots Transaction Management Annotation Enabletransactionmanagement



Spring Bootはトランザクションを非常に簡単に使用します。最初にアノテーション@EnableTransactionManagementを使用してトランザクションサポートを開き、次にデータベースにアクセスするServiceメソッドにアノテーション@Transactionalを追加します。

トランザクションマネージャーに関しては、JPAであろうとJDBCであろうと、セルフインターフェースPlatformTransactionManagerの実装spring-boot-starter-jdbc依存関係を追加すると、フレームワークはデフォルトでDataSourceTransactionManagerインスタンスを挿入します。 spring-boot-starter-data-jpa依存関係を追加すると、フレームワークはデフォルトでJpaTransactionManagerインスタンスを注入します。



次のメソッドをスタートアップクラスに追加できます。デバッグテスト。PlatformTransactionManagerインターフェイスのどの実装クラスが自動的に挿入されるかを知ることができます。

@EnableTransactionManagement // Invoicing transaction management, equivalent to xml configuration @SpringBootApplication public class ProfiledemoApplication { @Bean public Object testBean(PlatformTransactionManager platformTransactionManager){ System.out.println('>>>>>>>>>>' + platformTransactionManager.getClass().getName()) return new Object() } public static void main(String[] args) { SpringApplication.run(ProfiledemoApplication.class, args) } }

これらのSpringBootsは自動的に実行されます。これらは私たちには透過的ではありません。プロジェクトが多くのことを行っていて、永続性の依存関係を追加した場合でも、人為的に使用するトランザクションマネージャーを選択します。
コードは次のとおりです。



@EnableTransactionManagement @SpringBootApplication public class ProfiledemoApplication { // where the dataSource framework will automatically inject for us @Bean public PlatformTransactionManager txManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource) } @Bean public Object testBean(PlatformTransactionManager platformTransactionManager) { System.out.println('>>>>>>>>>>' + platformTransactionManager.getClass().getName()) return new Object() } public static void main(String[] args) { SpringApplication.run(ProfiledemoApplication.class, args) } }

Springコンテナーでは、@ Beanが最初にロードされ、フレームワークが他のPlatformTransactionManager実装クラスを再インスタンス化しないことを手動で注釈します。

次に、サービスで、@ Transactionalアノテーションが付けられたメソッドがトランザクションをサポートします。アノテーションがクラスにある場合、クラス全体のすべてのメソッドがデフォルトでトランザクションをサポートします。

同じプロジェクトで複数のトランザクションマネージャーを処理する方法については、以下の例を参照してください。具体的な手順については、コード内のコメントを参照してください。



@EnableTransactionManagement // Turn on annotation transaction management, equivalent to in the xml configuration file @SpringBootApplication public class ProfiledemoApplication implements TransactionManagementConfigurer { @Resource(name='txManager2') private PlatformTransactionManager txManager2 // Create transaction manager 1 @Bean(name = 'txManager1') public PlatformTransactionManager txManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource) } // Create transaction manager 2 @Bean(name = 'txManager2') public PlatformTransactionManager txManager2(EntityManagerFactory factory) { return new JpaTransactionManager(factory) } // Implement the interface TransactionManagementConfigurer method whose return value represents the transaction manager used by default with multiple transaction managers @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return txManager2 } public static void main(String[] args) { SpringApplication.run(ProfiledemoApplication.class, args) } }

注意:
Springコンテナに複数のPlatformTransactionManagerインスタンスがあり、インターフェイスTransactionManagementConfigurerがデフォルトで指定されていない場合、メソッドでアノテーション@Transactionalを使用するときは、値を指定する必要があります。指定しない場合は、例外がスローされます。

システムがデフォルトのトランザクション管理を提供する必要がある場合は、実装インターフェースTransactionManagementConfigurerが指定されます。

一部のシステムでは、不要な問題を回避するために、ビジネスで@Transactionalの値を明示的に指定する必要があります。コンソールが明示的に例外をスローし、開発者がそれを指定することを忘れないように、インターフェースTransactionManagementConfigurerを実装することはお勧めしません。