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 {