带有两个数据源的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);
}
}