java - Spring - 如何使用两个数据源正确配置@Transactional?

标签 java spring spring-boot

我有两个 spring 数据源配置,如下所示:

@EnableJpaRepositories(basePackages = {"XXXXXX",
                                       "XXXXXX"}, entityManagerFactoryRef = "postgreSqlEM", transactionManagerRef = "postgreSqlTM")
@EnableTransactionManagement
@Configuration
public class PostgreSqlDataSourceConfig {

    @Primary
    @Bean
    @ConfigurationProperties("spring.postgresql.hikari")
    public HikariConfig postgreSqlHikariConfig() {
        return new HikariConfig();
    }

    @Primary
    @Bean
    public DataSource postgreSqlDataSource() {
        return new HikariDataSource(postgreSqlHikariConfig());
    }

    @Primary
    @Bean("postgreSqlEM")
    public LocalContainerEntityManagerFactoryBean postgreSqlEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(postgreSqlDataSource()).packages("XXXXXX",
                                                                   "XXXXXX",
                                                                   "XXXXXX")

                      .build();
    }

    @Primary
    @Bean("postgreSqlTM")
    public JpaTransactionManager postgreSqlTransactionManager(@Qualifier("postgreSqlEM") EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

    @Primary
    @Bean
    public EntityManager getEntityManager(@Qualifier("postgreSqlEM") EntityManagerFactory emf) {
        return emf.createEntityManager();
    }
}

这是 @Primary,因此所有没有值配置的 @Transactional 以及所有 EntityManager 注入(inject)都应该指向它。

Spring boot 正常启动,但所有 @Transactional 注解都被忽略。

我收到这样的错误:

javax.persistence.TransactionRequiredException: javax.persistence.Query.executeUpdate requires active transaction

如何正确配置它以便 @Transactional 起作用?

我使用的是 Spring Boot 2.1.5.RELEASE。

最佳答案

首先, 每个数据源配置一个 TransactionManager。 两个数据源意味着您将有两个 TransactionManager。

这是一个例子:

    @Bean(name = "blamTransactionManager")
    @Primary
    public PlatformTransactionManager blamTransactionManager(
        @Qualifier("blamDataSourcePool") final DataSource blamDataSource)
    {
        return new DataSourceTransactionManager(
            blamDataSource);
    }

第二, 使用上面创建的两个事务管理器配置 ChainedTransactionManager

这是一个例子:

    @Bean(name = "chainedTransactionManager")
    public ChainedTransactionManager transactionManager(
        @Qualifier("blamTransactionManager") final PlatformTransactionManager blamTransactionManager,
        @Qualifier("kapowTransactionManager") final PlatformTransactionManager kapowTransactionManager)
    {
        return new ChainedTransactionManager(
            blamTransactionManager,
            kapowTransactionManager);
    }

最后, 在事务注释中引用 chainedTransactionManager。

例如:

    @Transactional("chainedTransactionManager")

关于java - Spring - 如何使用两个数据源正确配置@Transactional?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56500323/

相关文章:

java - 尝试读取 excel 时出现异常

java - 使用 Java WorldWind,但想要替代方案

方法重载中的 Java 转换

java - Camel JMS : how to configure custom message listener when connecting to a topic

java - Spring 框架,启用 PUT 方法

java - SpringBoot : Can I @Autowire Bean in runnable JAR from JAR provided using java -cp?

spring - 配置为监听端口 8080 的 Tomcat 连接器失败

java - Extjs文件上传响应和Java spring

java - 从数据库中检索 Spring Boot 配置

java - Uncaught Error : Could not load **** at XMLHttpRequest. xhr.onreadystatechange