Transactions Spring批处理中的XA事务

Transactions Spring批处理中的XA事务,transactions,batch-processing,spring-batch,distributed-transactions,xa,Transactions,Batch Processing,Spring Batch,Distributed Transactions,Xa,我正在用SpringBatch编写许多批处理作业,它们主要从数据库导出/导入数据。 Spring批处理作业存储库数据库和目标数据库(从/向其读取/写入数据)位于不同的计算机上 我的问题是我应该在这个配置中使用XA事务吗 我想知道在某个时间点链接到作业存储库db brakes时,它是否会潜在地损坏数据?像这样: 作业已启动(写入作业存储库) 在事务中读取/处理/写入目标数据库 链接到作业存储库数据库,作业失败 最后,我更新了目标数据库,但作业失败,因此在作业重新启动时将再次处理相同的数据。Spri

我正在用SpringBatch编写许多批处理作业,它们主要从数据库导出/导入数据。 Spring批处理作业存储库数据库和目标数据库(从/向其读取/写入数据)位于不同的计算机上

我的问题是我应该在这个配置中使用XA事务吗

我想知道在某个时间点链接到作业存储库db brakes时,它是否会潜在地损坏数据?像这样:

  • 作业已启动(写入作业存储库)
  • 在事务中读取/处理/写入目标数据库
  • 链接到作业存储库数据库,作业失败

  • 最后,我更新了目标数据库,但作业失败,因此在作业重新启动时将再次处理相同的数据。

    Spring Batch在其读写器中具有禁用临时状态保存的功能(您将属性
    saveState
    设置为false)。这允许您独立于Spring Batch JobRepository管理处理状态

    在您的示例中,您将在read表上维护一个“processed标志”,并将select语句修改为
    select*from x,其中processed=false
    。这将减少对JobRepository状态的依赖


    看一看,这将更详细地解释它。

    这会有所帮助,但问题是我无法修改读取表结构。因此,我们回到了jobRepository的设计目的;在没有其他机制的情况下保持状态。我的建议是,通过监听器或类似的工具,保持一个线性的、非事务性的状态日志,以便在JobRepository上出现故障时进行协调。这将允许您在发生异常故障的情况下进行协调和处理。