为什么Spring Batch事务范围是步骤级而不是作业级

时间:2016-02-26 16:06:26

标签: transactions spring-batch

已经完成了大量的互联网调查结果和其他来源,但是找不到任何有理由说明为什么春季批量交易在步骤级别而不是在多步骤作业中的工作级别上工作。

即使某个步骤被视为一个域,也就是根据文档的作业的独立单位,但它仍然是需要完成的工作(任务)的一部分。

假设作业需要读取一个excel文件(包含2张,每行有6百万行)。

我想说每张纸的阅读都是以一种形式打破的。每个工作表都有自己的行和写入处理方式(Database)。

任何纸张的处理与其他纸张没有任何关系。这些是独立的单位。但是任何工作表的整体处理都是工作的子任务。

如果任何工作表中存在任何问题,并且应该回滚到目前为止所写的任何数据,则应将文件处理视为FAILURE。

但是因为阅读表已经采用步骤形式,并且如果已成功处理工作表,则在下一页中注意到失败的情况下将不会回滚。

我不同意为了解决方案而将两个步骤合并为一个步骤。

为什么spring批处理没有提供任何选项来回滚作业失败的所有步骤(任务)?

我不想将数据从一个步骤转发到另一个步骤(仅向数据库写入一次),因为这根本不是我之前所说的相关数据,并且在很长时间内也是大量(600万)行内存中的帧。

1 个答案:

答案 0 :(得分:0)

首先,交易处于步骤级别并不正确。它们更精细 - 在块级别。

你没有围绕工作进行一次重大交易的原因是性能 - 如果你的交易需要多个小时,有几千兆字节的未提交数据,并且最终风险很高,那么事情看起来不会很好由于与另一个交易发生冲突,交易将不得不回滚,或者更糟糕的是阻止其他用户访问相同的表。

Spring Batch中途处理错误的方法是在手动处理错误之后允许从上一个成功的步/块重新启动作业。当然,这并不总是可行的。