【问题标题】:Disable transactions in my Spring Batch job在我的 Spring Batch 作业中禁用事务
【发布时间】:2019-03-12 09:07:28
【问题描述】:

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

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

【问题讨论】:

    标签: java spring transactions spring-batch


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      禁用spring批量事务:

      1. 带有参数 DefaultTransactionAttribute 的 AbstractTaskletStepBuilder 中的用户 .transactionAttribute(attributes()) 方法。
      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;
      }
      

      【讨论】:

        【解决方案3】:

        Spring Batch 是高度自以为是的框架。您可以拆分 Step 或在 REQUIRES_NEW 事务中完成您的工作。或者选择其他限制较少的框架。

        【讨论】:

          猜你喜欢
          • 2014-12-24
          • 1970-01-01
          • 1970-01-01
          • 2020-09-24
          • 1970-01-01
          • 2020-07-26
          • 2012-12-19
          • 2019-06-09
          • 1970-01-01
          相关资源
          最近更新 更多