【问题标题】:Transaction Management in Spring batchSpring批处理中的事务管理
【发布时间】:2013-09-26 14:35:51
【问题描述】:

我正在使用 spring batch 开发一个批处理,我有两个步骤,一个更新 table1 的 step1 和另一个更新 table2 的 step2。

如果第二步失败,我想取消所有处理(回滚)。我该怎么办??

我有下面的示例 xml 配置:

<b:step id="Step1" parent="Tache">
    <b:tasklet>
        <b:chunk reader="baseReader" processor="baseProcessor"
             chunk-completion-policy="completionPolicy"  />
    </b:tasklet>
</b:step>

<b:step id="Step2" parent="Tache">
    <b:tasklet>
        <b:chunk reader="baseReaderEcriture" 
            writer="ecritureWriter" chunk-completion-policy="completionPolicy"  />
    </b:tasklet>
</b:step>

<b:job id="batch" parent="Batch">
    <b:step id="step1" parent="Step1" next="step2"/>
    <b:step id="step2" parent="Step2" />
</b:job>

谢谢!

【问题讨论】:

标签: java spring spring-batch


【解决方案1】:

您无法回滚已提交的数据(在每个块之后 - 基于您的完成策略 - 只要提交了 spring-batch 元数据,您的数据就可以),因此您无法自动回滚第 1 步中存储的所有数据。
也许你可以使用这个语法:

<b:job id="batch" parent="Batch">
    <b:step id="step1" parent="Step1" next="step2"/>
    <b:step id="step2" parent="Step2">
      <next on="ROLLBACK_ALL" to="deleteDataSavedByStep1Step" />
      <end on="*" />
    </b:step>
</b:job>

移动到用于删除步骤 1 保存的数据的步骤旁边,但您必须知道在deleteDataSavedByStep1Step 步骤中要删除哪些数据。

【讨论】:

【解决方案2】:

【讨论】:

  • 谢谢你的回复,我用的是单数据库(datasource),我觉得不需要XA事务?在第二个链接上,我已经看过了,但他没有谈到我的情况:如果第 2 步失败,则回滚第 1 步...
  • 我尝试了如何在同一个事务管理器中覆盖 step1 和 step2 的方法! ?
  • 阅读我对我的回答的评论;整个 tx 管理确实是个坏主意!
【解决方案3】:

嗨,我希望它可以帮助别人。如果这些步骤成功,只需为每个检查任务创建一个步骤,然后启动将您的数据保存到数据库的最后一步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2021-05-31
    • 2015-07-16
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多