java-有关事务管理的问题
作者:互联网
我正在尝试通过Spring实现业务需求,并且在事务管理方面遇到一些问题.
简单来说,业务需求是
1)使用某些条件查询数据库(#1).
2)将查询结果写入平面文件.
3)将数据库(#1)中的记录更新为“已处理”.
4)作为前三个步骤的结果,将记录插入另一个数据库(#2).
我需要这4个步骤才能过关.例如,如果第四步失败,则应回滚第二步中写入平面文件的最后一项.
我找到了“ Apache Commons File Resource Manager”来实现文件的回滚机制.
我的导师建议我将Spring Batch通常用于此类项目.但是,考虑到Spring Batch使用“面向块的处理”样式这一事实,使用Spring Batch来实现它似乎非常困难.因为据我所知,面向块的样式要求整个块都完成第二步,然后才能继续执行我的实现的第三步和第四步.
我想我需要有关该项目以及是否为此目的使用Spring Batch的一些一般性建议.此外,尝试在并发环境中实现这些需求是一个好主意,因为对于该样式,回滚机制将非常复杂.
解决方法:
批处理的目的是将您要执行的工作分解为可单独(顺序或并行)处理的小工作单元. Spring batch是一个框架,为您提供了一种基于Spring的灵活机制,使您可以执行批处理样式.根据您的需求,您可以配置Spring批处理以多种方式执行.您提到的面向块的处理只是使用Spring批处理的一种方式.
如果我查看您提供的信息,以下是您所看到的应用程序元素:
>从数据库中读取需要的记录
待处理
>处理记录,结果是
db#2正在更新
>将记录标记为已处理
>将记录写入已处理的文件
您会注意到我稍微重新安排了事件的顺序.我所描述的逻辑非常适合批处理类型.这是一个示例,说明如何使用Spring批处理来管理此处理:
>从数据库中检索要处理的记录.检索将通过自定义数据库检索器完成.这些记录将被Spring Batch用作记录选择器.然后,您将配置Spring批处理以遍历此列表.
>您将配置Spring批处理的下一步,以处理在步骤1中检索到的每个记录.此处理将包括处理单个记录并将结果写入第二个db.
>您的最后一步是结束对单个记录的处理.与大多数Spring框架一样,发生这种情况时,可以通过多种不同的方式进行配置.最后一步将执行两个功能:在处理后更新db#1中的记录,并将处理后的记录写入输出文件.可以在完成整个批处理过程的第4步中执行输出文件的写入,在该过程中,您将查看当前运行期间标记为已处理的记录,并根据需要写入数据.
Spring Batch确实可以让您配置在整个处理过程中如何管理事务,因此您可以配置一个跨所有操作的事务,如果文件写入失败,则可以将其配置为回滚其余的数据库操作.
使用这种方法,您可以按顺序,并行等方式处理记录.但是,所有这些都假定您可以将数据分解为较小的工作单元.如果不是这种情况,那么批处理并不是真正可以执行的操作,因为您只有一个进程.
我想说一个简单的答案来决定是否使用Spring批处理.它是一个平台,可以让您做很多事情.除了灵活性之外,它的学习曲线也相对较高.
希望这可以帮助.
标签:multithreading,spring-batch,java 来源: https://codeday.me/bug/20191208/2093113.html