在springboot中使用异步任务@Async 或 使用Quartz任务调度时,出现事务丢失问题,事物丢失不会影响数据查询(SELECT),但是当进行增删改操作时,因为事物问题,无法执行结果到数据库。
使用@Transactional注解也无法注入事务。
发现问题如下:
我们在配置事务时,默认会使用DataSourceTransactionManager
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
return transactionManager;
}
DataSourceTransactionManager 也继承了PlatformTransactionManager,但是通过查看jpa的官方文档我们可以发下,jpa使用的事务管理器为JpaTransactionManager
官方文档如下:
@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
class ApplicationConfig {
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.HSQL).build();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.acme.domain");
factory.setDataSource(dataSource());
return factory;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
因此我们只需要将事务管理器代码修改为JpaTransactionManager即可,也可以在@SpringbootApplication的注解上加
@EnableTransactionManagement开启事务
jpa 2.X版本默认使用事务管理器为JpaTransactionManager ,不需要去配置事务管理器