在我的Spring Batch作业中禁用事务

时间:2019-03-12 09:07:29

标签: java spring transactions spring-batch

我需要在数据库中插入一条记录,以便另一个系统可以读取该记录。之后,我将用我的ItemWriter用CSV文件编写从该系统收到的响应。

我的问题是,由于Spring Batch是事务性的,因此系统无法读取记录。如何禁用该属性?

3 个答案:

答案 0 :(得分:2)

禁用 spring 批量事务:

  1. 来自 AbstractTaskletStepBuilder 的用户 .transactionAttribute(attributes()) 方法,带有参数 DefaultTransactionAttribute。
  2. 使用事务传播构建 DefaultTransactionAttribute 对象。

示例:

@Bean
public Step springBatchStep() {
    return this.stepBuilderFactory.get("springBatchStep")
        ...
        .reader()
        .processor()    
        .writer()
        .transactionAttribute(attributesForTransaction())
        ...
        .build();
}
    
private DefaultTransactionAttribute attributesForTransaction() {
     DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
     attribute.setPropagationBehavior(Propagation.NOT_SUPPORTED.value());
    attribute.setIsolationLevel(Isolation.DEFAULT.value());
    return attribute;
}

答案 1 :(得分:1)

您不想禁用事务强制执行,这可能会使您面临严重的数据完整性问题。即使是1%的错误问题也很容易导致成千上万甚至数千万的不完整或不良记录。特别是如果说您正在与之交互的数据库之一或您正在编写的文件系统不可用。随着时间的推移将会发生。这也会破坏作业重试功能。

一个更好的选择是将流程分为多个步骤或作业,以使事务边界适合您的流程。因此,其中一个会写出到另一个数据库,然后下一步或作业将对文件进行读写。

答案 2 :(得分:0)

Spring Batch是备受好评的框架。您可以拆分Step或在{{1}}事务中完成工作。或选择其他限制性较小的框架。