Spring-boot TransactionRequiredException:正在执行 update/delete 查询
Spring-boot TransactionRequiredException: Executing an update/delete query
我的服务方式标注了跨国(org.springframework.transaction.annotation)
但是在对 table 人进行更新时仍然会出现“TransactionRequiredException”。
select 在同一个 table 上工作正常。
@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);
}
}
因为项目中定义了多个TransactionManager beans,所以你必须用他们的名字来注释非主TransactionaManager 的事务。例如,在我上面的配置中,TransactionManager 名称被定义为“transactionManager”。
因此,方法上的事务注释应该看起来像这样:@Transactional("transactionManager")
我的服务方式标注了跨国(org.springframework.transaction.annotation) 但是在对 table 人进行更新时仍然会出现“TransactionRequiredException”。 select 在同一个 table 上工作正常。
@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);
}
}
因为项目中定义了多个TransactionManager beans,所以你必须用他们的名字来注释非主TransactionaManager 的事务。例如,在我上面的配置中,TransactionManager 名称被定义为“transactionManager”。 因此,方法上的事务注释应该看起来像这样:@Transactional("transactionManager")