我正在尝试用Spring实现业务需求并且在事务管理方面存在一些问题。
简单来说,业务需求是
1)使用某些条件查询数据库(#1)。
2)将查询结果写入平面文件。
3)将数据库(#1)中的那些记录更新为“已处理”。
4)作为前3个步骤的结果,将记录插入另一个数据库(#2)。
我需要这4个步骤才能实现。例如,如果第4步失败,则应回滚在第2步中写入平面文件的最后一项。 我找到了“Apache Commons文件资源管理器”来实现文件的回滚机制。
我的导师建议我将Spring Batch用于这类项目。但是,考虑到Spring Batch使用“面向块的处理”样式这一事实,使用Spring Batch实现它看起来相当困难。因为,据我所知,面向块的样式需要为整个块完成第二步,然后它允许继续执行我的实现中的第3步和第4步。
我想我需要一些关于这个项目的一般建议,以及是否为此目的使用Spring Batch。此外,尝试在并发环境中实现这些需求是一个好主意,因为对于该样式,回滚机制将非常复杂。
答案 0 :(得分:3)
批处理的目的是将您尝试做的事情细分为可以单独处理(顺序或并行)的小工作单元。 Spring批处理是一个框架,它为您提供了一个基于Spring构建的灵活机制,允许您执行批处理样式处理。根据您的要求,您可以配置Spring批处理以多种方式执行。您提到的面向块的处理只是可以使用Spring批处理的一种方法。
如果我查看您提供的信息,以下是我看到的应用程序的元素:
你会注意到我重新排列了一些事件的顺序。我所描述的逻辑非常适合批处理式处理。以下是如何使用Spring批处理来管理此处理的示例:
Spring批处理允许您配置事务在整个处理过程中的管理方式,因此您可以配置跨越所有操作的事务,如果文件写入失败,则可以将其配置为回滚其余的数据库操作。
使用这种方法,您可以按顺序,并行等处理记录。但是,所有这些都假定您可以将数据分解为更小的工作单元。如果不是这种情况,那么批处理实际上并不是可以执行的,因为您只有一个进程。
我想说一个简单的答案来决定是否使用Spring批次。这是一个让你做很多事情的平台。除了这种灵活性,它确实具有相对较高的学习曲线。
希望这有帮助。
答案 1 :(得分:0)
我会说Spring的方法是实现Spring's PlatformTransactionManager
abstraction的平面文件版本,它会阻止文件写入,直到提交事务为止。不应该太难。