From 144b0e143759509c2b1497b8a44967209b425274 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Mon, 6 Apr 2020 15:16:31 +0200 Subject: [PATCH] Test status quo for @Primary + TransactionManagementConfigurer This commit introduces tests for the status quo in production support for multiple transaction managers registered as @Primary and via the TransactionManagementConfigurer API. See gh-24869 --- .../EnableTransactionManagementTests.java | 87 ++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/spring-tx/src/test/java/org/springframework/transaction/annotation/EnableTransactionManagementTests.java b/spring-tx/src/test/java/org/springframework/transaction/annotation/EnableTransactionManagementTests.java index 763ecb9503..fd44552667 100644 --- a/spring-tx/src/test/java/org/springframework/transaction/annotation/EnableTransactionManagementTests.java +++ b/spring-tx/src/test/java/org/springframework/transaction/annotation/EnableTransactionManagementTests.java @@ -31,6 +31,7 @@ import org.springframework.context.annotation.ConditionContext; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ConfigurationCondition; +import org.springframework.context.annotation.Primary; import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; @@ -106,7 +107,6 @@ public class EnableTransactionManagementTests { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( EnableTxConfig.class, MultiTxManagerConfig.class); TransactionalTestBean bean = ctx.getBean(TransactionalTestBean.class); - CallCountingTransactionManager txManager = ctx.getBean("txManager", CallCountingTransactionManager.class); CallCountingTransactionManager txManager2 = ctx.getBean("txManager2", CallCountingTransactionManager.class); @@ -122,6 +122,48 @@ public class EnableTransactionManagementTests { ctx.close(); } + @Test + public void txManagerIsResolvedCorrectlyWhenMultipleManagersArePresentAndOneIsPrimary() { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( + EnableTxConfig.class, PrimaryMultiTxManagerConfig.class); + TransactionalTestBean bean = ctx.getBean(TransactionalTestBean.class); + CallCountingTransactionManager primary = ctx.getBean("primary", CallCountingTransactionManager.class); + CallCountingTransactionManager txManager2 = ctx.getBean("txManager2", CallCountingTransactionManager.class); + + // invoke a transactional method, causing the PlatformTransactionManager bean to be resolved. + bean.findAllFoos(); + + assertThat(primary.begun).isEqualTo(1); + assertThat(primary.commits).isEqualTo(1); + assertThat(primary.rollbacks).isEqualTo(0); + assertThat(txManager2.begun).isEqualTo(0); + assertThat(txManager2.commits).isEqualTo(0); + assertThat(txManager2.rollbacks).isEqualTo(0); + + ctx.close(); + } + + @Test + public void txManagerIsResolvedCorrectlyWithTxMgmtConfigurerAndPrimaryPresent() { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( + EnableTxConfig.class, PrimaryTxManagerAndTxMgmtConfigurerConfig.class); + TransactionalTestBean bean = ctx.getBean(TransactionalTestBean.class); + CallCountingTransactionManager primary = ctx.getBean("primary", CallCountingTransactionManager.class); + CallCountingTransactionManager annotationDriven = ctx.getBean("annotationDrivenTransactionManager", CallCountingTransactionManager.class); + + // invoke a transactional method, causing the PlatformTransactionManager bean to be resolved. + bean.findAllFoos(); + + assertThat(primary.begun).isEqualTo(0); + assertThat(primary.commits).isEqualTo(0); + assertThat(primary.rollbacks).isEqualTo(0); + assertThat(annotationDriven.begun).isEqualTo(1); + assertThat(annotationDriven.commits).isEqualTo(1); + assertThat(annotationDriven.rollbacks).isEqualTo(0); + + ctx.close(); + } + /** * A cheap test just to prove that in ASPECTJ mode, the AnnotationTransactionAspect does indeed * get loaded -- or in this case, attempted to be loaded at which point the test fails. @@ -295,6 +337,49 @@ public class EnableTransactionManagementTests { } + @Configuration + static class PrimaryMultiTxManagerConfig { + + @Bean + public TransactionalTestBean testBean() { + return new TransactionalTestBean(); + } + + @Bean + @Primary + public PlatformTransactionManager primary() { + return new CallCountingTransactionManager(); + } + + @Bean + public PlatformTransactionManager txManager2() { + return new CallCountingTransactionManager(); + } + } + + + @Configuration + static class PrimaryTxManagerAndTxMgmtConfigurerConfig implements TransactionManagementConfigurer { + + @Bean + public TransactionalTestBean testBean() { + return new TransactionalTestBean(); + } + + @Bean + @Primary + public PlatformTransactionManager primary() { + return new CallCountingTransactionManager(); + } + + @Bean + @Override + public PlatformTransactionManager annotationDrivenTransactionManager() { + return new CallCountingTransactionManager(); + } + } + + @Configuration @EnableTransactionManagement static class Spr11915Config {