有关交易管理的问题

时间:2011-03-03 13:32:30

标签: java multithreading spring-batch

我正在尝试用Spring实现业务需求并且在事务管理方面存在一些问题。

简单来说,业务需求是 1)使用某些条件查询数据库(#1)。
2)将查询结果写入平面文件。
3)将数据库(#1)中的那些记录更新为“已处理”。
4)作为前3个步骤的结果,将记录插入另一个数据库(#2)。

我需要这4个步骤才能实现。例如,如果第4步失败,则应回滚在第2步中写入平面文件的最后一项。 我找到了“Apache Commons文件资源管理器”来实现文件的回滚机制。

我的导师建议我将Spring Batch用于这类项目。但是,考虑到Spring Batch使用“面向块的处理”样式这一事实,使用Spring Batch实现它看起来相当困难。因为,据我所知,面向块的样式需要为整个块完成第二步,然后它允许继续执行我的实现中的第3步和第4步。

我想我需要一些关于这个项目的一般建议,以及是否为此目的使用Spring Batch。此外,尝试在并发环境中实现这些需求是一个好主意,因为对于该样式,回滚机制将非常复杂。

2 个答案:

答案 0 :(得分:3)

批处理的目的是将您尝试做的事情细分为可以单独处理(顺序或并行)的小工作单元。 Spring批处理是一个框架,它为您提供了一个基于Spring构建的灵活机制,允许您执行批处理样式处理。根据您的要求,您可以配置Spring批处理以多种方式执行。您提到的面向块的处理只是可以使用Spring批处理的一种方法。

如果我查看您提供的信息,以下是我看到的应用程序的元素:

  • 从需要的数据库中读取记录 待处理
  • 处理记录,结果是 正在更新数据库#2
  • 将记录标记为已处理
  • 将记录写入已处理文件

你会注意到我重新排列了一些事件的顺序。我所描述的逻辑非常适合批处理式处理。以下是如何使用Spring批处理来管理此处理的示例:

  1. 从要处理的数据库中检索记录。检索将通过自定义数据库检索器完成。这些记录将被Spring Batch用作记录选择器。然后,您将配置Spring批处理以迭代此列表。
  2. 您将配置Spring批处理的下一步来处理在步骤1中检索到的每个记录。此处理将包括处理单个记录并将结果写入第二个数据库。
  3. 最后一步是完成个人记录的处理。与大多数Spring框架一样,发生这种情况时可以使用许多不同的方法进行配置。最后一步将执行两个功能:将db#1中的记录更新为已处理,并将处理后的记录写入输出文件。输出文件的写入可以在完成整个批处理过程时作为步骤4执行,您可以在其中查看在当前运行期间标记为已处理的记录并根据需要写入数据。
  4. Spring批处理允许您配置事务在整个处理过程中的管理方式,因此您可以配置跨越所有操作的事务,如果文件写入失败,则可以将其配置为回滚其余的数据库操作。

    使用这种方法,您可以按顺序,并行等处理记录。但是,所有这些都假定您可以将数据分解为更小的工作单元。如果不是这种情况,那么批处理实际上并不是可以执行的,因为您只有一个进程。

    我想说一个简单的答案来决定是否使用Spring批次。这是一个让你做很多事情的平台。除了这种灵活性,它确实具有相对较高的学习曲线。

    希望这有帮助。

答案 1 :(得分:0)

我会说Spring的方法是实现Spring's PlatformTransactionManager abstraction的平面文件版本,它会阻止文件写入,直到提交事务为止。不应该太难。