带有两个数据源的Spring引导批处理导致javax.persistence.TransactionRequiredException:执行更新/删除查询
我有一个带有两个数据源的Spring引导批处理导致javax.persistence.TransactionRequiredException:执行更新/删除查询,java,spring,spring-boot,spring-batch,spring-transactions,Java,Spring,Spring Boot,Spring Batch,Spring Transactions,我有一个springbootbatch项目,有两个数据源,一个用于批处理表,一个用于业务表。从业务数据库读取数据时,它工作良好 我的配置看起来像 @Configuration @EnableBatchProcessing public class DataSourceConfiguration { @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource") pub
springbootbatch
项目,有两个数据源,一个用于批处理表,一个用于业务表。从业务数据库读取数据时,它工作良好
我的配置看起来像
@Configuration
@EnableBatchProcessing
public class DataSourceConfiguration {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.sybasedatasource")
public DataSource sybaseDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
BatchConfigurer batchConfigurer(DataSource dataSource) {
return new DefaultBatchConfigurer(dataSource);
}
@Bean
TaskConfigurer taskConfigurer(DataSource dataSource) {
return new DefaultTaskConfigurer(dataSource);
}
}
但是当我执行更新时
public interface DocumentRepository extends JpaRepository<DocumentDescriptor, Integer> {
@Modifying
@Query(value = "update document set process_status = :status where process_status = 10001 and document_id = :documentId")
int updateDocumentStatus(Integer status, Integer documentId);
}
使用了@Transaction(“tm2”)
,但例外情况仍然相同
你知道怎么做才能得到一笔合适的交易吗?我用
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages =
"...",
entityManagerFactoryRef = "sybaseEntityManagerFactory",
transactionManagerRef = "sybaseTransactionManager"
)
public class DataSourceConfiguration {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.sybasedatasource")
public DataSource sybaseDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public LocalContainerEntityManagerFactoryBean sybaseEntityManagerFactory() {
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), Collections.emptyMap(), null)
.dataSource(sybaseDataSource())
.packages("...")
.persistenceUnit(DataSourceConfiguration.class.getSimpleName())
.build();
}
@Bean
@Primary
public DataSourceTransactionManager postgresTransactionManager(@Qualifier("dataSource") DataSource datasource) {
return new DataSourceTransactionManager(datasource);
}
@Bean
public JpaTransactionManager sybaseTransactionManager(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
和
@Transactional(“sybaseTransactionManager”)
您如何设置crud回购的实体管理器?以某种方式检查事务是否被某些库禁用。我没有设置任何实体管理器,也没有扫描repo类。我使用的是spring boot starter数据jpa
您应该设置entityManager并进行扫描,看看这样做后它是否正常工作。谢谢@sonus21。它把我推向了正确的方向。我用solution.done@MahmoudBenHassine更新了我的帖子
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages =
"...",
entityManagerFactoryRef = "sybaseEntityManagerFactory",
transactionManagerRef = "sybaseTransactionManager"
)
public class DataSourceConfiguration {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.sybasedatasource")
public DataSource sybaseDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public LocalContainerEntityManagerFactoryBean sybaseEntityManagerFactory() {
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), Collections.emptyMap(), null)
.dataSource(sybaseDataSource())
.packages("...")
.persistenceUnit(DataSourceConfiguration.class.getSimpleName())
.build();
}
@Bean
@Primary
public DataSourceTransactionManager postgresTransactionManager(@Qualifier("dataSource") DataSource datasource) {
return new DataSourceTransactionManager(datasource);
}
@Bean
public JpaTransactionManager sybaseTransactionManager(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}