我有两个 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/