【发布时间】:2019-03-12 09:07:28
【问题描述】:
我需要在我的数据库中插入一条记录,以便另一个系统可以读取该记录。之后,我将(使用我的 ItemWriter)将从该系统收到的响应写入 CSV 文件中。
我的问题是系统无法读取记录,因为 Spring Batch 是事务性的。如何禁用该属性?
【问题讨论】:
标签: java spring transactions spring-batch
我需要在我的数据库中插入一条记录,以便另一个系统可以读取该记录。之后,我将(使用我的 ItemWriter)将从该系统收到的响应写入 CSV 文件中。
我的问题是系统无法读取记录,因为 Spring Batch 是事务性的。如何禁用该属性?
【问题讨论】:
标签: java spring transactions spring-batch
您不想禁用事务执行,这可能会给您带来严重的数据完整性问题。即使是 1% 的错误问题,也很容易导致数万甚至数千万的不完整或不良记录。特别是如果说您正在与之交互的数据库之一,或者您正在编写的文件系统变得不可用。随着时间的推移,这会发生。它还会破坏作业重试功能。
更好的选择是将流程分解为多个步骤或作业,以便事务边界适合您的流程。所以他们中的一个写出到另一个数据库,然后下一步或工作对文件进行读写。
【讨论】:
禁用spring批量事务:
例子:
@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;
}
【讨论】:
Spring Batch 是高度自以为是的框架。您可以拆分 Step 或在 REQUIRES_NEW 事务中完成您的工作。或者选择其他限制较少的框架。
【讨论】: