【问题标题】:Spring-boot TransactionRequiredException: Executing an update/delete querySpring-boot TransactionRequiredException:执行更新/删除查询
【发布时间】:2021-04-16 13:17:09
【问题描述】:

我的服务方法用 Transnational 注释 (org.springframework.transaction.annotation) 但是在对 Persons 表进行更新时仍然会发生“TransactionRequiredException”。 同一张表上的选择工作正常。

@Transactional
public String myMethod(String contractNo){
    myRepository.resetValues(contractNo);
}

@Repository
public interface MyRepository extends JpaRepository<Persons, Long> {

    @Modifying
    @Query(value = "UPDATE PERSONS SET status = 0 WHERE LOGIN_NAME like :contractNo", nativeQuery = true)
    void resetValues(@Param("contractNo") String contractNo);
}



@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactory",
        transactionManagerRef = "transactionManager",
        basePackages = { "com.mypackage.repositories" }
)
public class EBankingDBConfig {

    @Bean(name = "dataSource")
    @ConfigurationProperties(prefix = "spring.eba-datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("dataSource") DataSource dataSource) {
        return builder.dataSource(dataSource)
                        .packages("com.mypackage.model")
                        .persistenceUnit("myPersistenceUnit")
                        .build();
    }

    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("entityManagerFactory") EntityManagerFactory
                    entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

【问题讨论】:

  • 我已经确定了问题所在。由于应用程序访问多个数据库,因此项目中还有其他 db Config 类。根据 Spring,其中一个 db 配置文件应该被认为是“主要的”。这是通过使用 Primary 注释配置类中的所有 bean 来完成的。我发现与具有 Primary 注释的 db config 类关联的 Sping-data 存储库确实可以正确执行事务。其他 db Config 类(内部没有 Primary 注释)没有正确实例化事务管理器。

标签: spring-boot spring-data


【解决方案1】:

由于项目中定义了多个 TransactionManagers bean,因此您必须用它们的名称注释非主要 TransactionaManagers 的事务。例如,在我上面的配置中,TransactionManager 名称被定义为“transactionManager”。 因此,方法上的 Transactional 注释应该如下所示:@Transactional("transactionManager")

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2014-11-07
    • 2012-09-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多