本人Spring菜鸟,当我使用Springcloud+redis队列时,我在其中一个模块启动定时器定时从Redis中取数据更新至数据库,出现了TransactionRequiredException,解决方ran案是在做更新操作的service层的方法上加上@Transactionl 并添加配置类如下即可完美解决事务问题:
import org.apache.tomcat.jdbc.pool.DataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.TransactionManagementConfigurer; import javax.persistence.EntityManagerFactory; /** * Created by JENSEN on 2017/11/15. */ @Configuration public class DataSourceConfig implements TransactionManagementConfigurer { @Value("${spring.profiles.active}") private String profiles; @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driverClassName}") private String driverClassName; @Value("${spring.datasource.max-active}") private Integer maxActive; @Value("${spring.datasource.max-idle}") private Integer maxIdle; @Value("${spring.datasource.min-idle}") private Integer minIdle; @Value("${spring.datasource.initial-size}") private Integer initialSize; @Value("${spring.datasource.validation-query}") private String validationQuery; @Value("${spring.datasource.test-on-borrow}") private Boolean testOnBorrow; @Value("${spring.datasource.test-on-return}") private Boolean testOnReturn; @Value("${spring.datasource.test-while-idle}") private Boolean testWhileIdle; @Bean public DataSource dataSource() { DataSource ds = new DataSource(); ds.setUrl(url); ds.setUsername(username); ds.setPassword(password); ds.setDriverClassName(driverClassName); ds.setMaxActive(maxActive); ds.setMinIdle(minIdle); ds.setInitialSize(initialSize); ds.setValidationQuery(validationQuery); ds.setTestOnBorrow(testOnBorrow); ds.setTestOnReturn(testOnReturn); ds.setTestWhileIdle(true); return ds; } @Primary @Bean EntityManagerFactory entityManagerFactory() { LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); emf.setDataSource(dataSource()); emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); emf.setPackagesToScan("com.spring.jensen"); emf.setPersistenceUnitName("default"); emf.afterPropertiesSet(); return emf.getObject(); } @Bean public PlatformTransactionManager transactionManager() { return new JpaTransactionManager(entityManagerFactory()); } @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return null; } }
在Springcloud环境中,结合Redis队列使用定时任务时遇到无法获取事务的问题。解决方案是在Service层的更新方法上添加@Transactional注解,并配置相应的事务管理类,从而确保更新操作在事务保护下进行。

392

被折叠的 条评论
为什么被折叠?



