当前位置: 首页 > 知识库问答 >
问题:

spring批处理项目编写器中的事务未回滚

养聪
2023-03-14

事务在Spring批处理中未回滚。我有意抛出异常来测试事务回滚。即使从项目编写器引发异常,数据库事务也在提交。下面是写入器中保存到DB中的方法。对象是注入到此类中的 jpa 存储库



    private void writeCEs(Map> agentMap) throws FailedCompensationException, Exception {

        for (Entry> agent : agentMap.entrySet()) {
            agent.getValue().stream().forEach((ce) -> {
                compEvent.save(ce);
            });
            updateRecordFileStatus(agent.getKey());
            //postToAccounting(agent.getKey(), agent.getValue());
        }
        throw new Exception("Testing XA roolback.... ");
     }

我尝试用@Transactional(传播=Propagation.REQUIRES_NEW, rollbackFor=Exception.class)标记上述方法的事务,但它仍然在提交事务。我肯定我错过了一些东西。任何帮助都将不胜感激。

下面是我的批量配置



       @EnableBatchProcessing
        @EnableTransactionManagement @Configuration @ComponentScan({ "com.pm.*" })

    public class TrueBatchConfig extends DefaultBatchConfigurer {

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;

    @Autowired
    EventReader reader;

    @Autowired
    private EventProcessor processor;

    @Autowired
    private EventWriter writer;

    @Bean
    protected Step step1(ThreadPoolTaskExecutor executor) {
        DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
        attribute.setPropagationBehavior(Propagation.REQUIRED.value());
        attribute.setIsolationLevel(Isolation.DEFAULT.value());     
        attribute.setTimeout(30);

        return steps.get("step1")., Map>>chunk(10).reader(reader)
                .processor(processor).writer(writer).transactionAttribute(attribute).build();
    }

    @Bean(name = "firstBatchJob")
    public Job job(@Qualifier("step1") Step step1) {
        return jobs.get("firstBatchJob").start(step1).build();
    }
    }

共有1个答案

钱钊
2023-03-14

根据您的配置,Spring Batch未配置为使用您的< code > JpaTransactionManager ,您需要覆盖< code > getTransactionManager ,请参见此处的示例。在您的情况下,应该是这样的:

public class TrueBatchConfig extends DefaultBatchConfigurer {

   // .. 

    @Override
    public PlatformTransactionManager getTransactionManager() {
        return new JpaTransactionManager(); // TODO set entity manager factory
    }

}
 类似资料:
  • 关于文章Spring批处理CompositeItemWriter如何管理委托编写器的事务?,对于复合项编写器事务管理,难道不应该将数据源包装在如下所示的事务管理器中吗?没有下面的bean定义,事务管理就无法与Oracle和Hikari CP一起工作。不确定帖子中提供的示例是如何工作的。请澄清

  • 我目前正在编写一个Spring批处理,其中我正在读取一个数据块,并对其进行处理,然后我希望将此数据传递给两个Writer。一个writer将简单地更新数据库,而第二个writer将写入csv文件。 我计划编写自己的自定义编写器,并在customItemWriter中注入这两个ItemWriter,并在customItemWriter的write方法中调用这两个ItemWrite的write方法。这

  • 我必须像这样配置批处理作业流。 XML文件阅读器- 我的定制处理器是这样的 这是一个好的方法吗?我看到了一些CompositeProcess、CompositeWriter的例子,但没有一个适合我的案例。 提前谢谢。

  • 在我的Spring boot和Spring batch应用程序中,我有这样一个步骤: 我的作家是一个空的,如下所示: 现在,在我的处理器中,我有: 问题:由于所有对象都传递给处理器,我可以在处理器本身中处理它们,而不是使用任何转换等,因为我的目的通过使用处理器来解决,这是一个好的做法吗?或者我必须使用作家/自定义作家来完成工作?