Spring Batch作业后更新记录抛出「无事务进行中」异常排查
Spring Batch监听器更新数据库时抛出TransactionRequiredException问题
环境与配置说明
- Job Repository配置:采用基于Map的实现,使用ResourcelessTransactionManager,配置类如下:
@Configuration @EnableBatchProcessing public class BatchConfigurer extends DefaultBatchConfigurer { @Override public void setDataSource(DataSource dataSource){ } }
- 多数据源与事务管理器配置:使用了与Spring Batch默认不同的PlatformTransactionManager,因此在配置中设置
spring.main.allow-bean-definition-overriding=true,自定义事务管理器的配置如下:
@Configuration @EnableJpaRepositories( basePackages = "repo's package", entityManagerFactoryRef = "entityManagerFactory", transactionManagerRef = "transactionManager" ) public class DatasourceConfiguration { @Bean(name = "transactionManager") public PlatformTransactionManager transactionManager( @Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory ) { // 已定义数据源等相关配置 return new JpaTransactionManager(entityManagerFactory); } }
问题描述
通过实现JobExecutionListener,在afterJob方法中根据作业退出状态更新启动批处理的记录状态。本地环境运行正常,但部署到K8s远程服务器时抛出异常:
javax.persistence.TransactionRequiredException: no transaction is in progress
已尝试的方案
- 给
afterJob方法添加@Transactional(transactionManager = "myTransactionManager")注解,无效。 - 设置
hibernate.allow_update_outside_transaction=true可以解决问题,但担心这会影响Chunk出错时的回滚逻辑,且不清楚问题根源。
内容的提问来源于stack exchange,提问作者Kaepxer
相关产品推荐
相关产品推荐

