2013-09-26 115 views
2

我正在使用spring批处理开发一个批处理,我有两个步骤,一个step1更新table1,另一个step2更新table2。Spring批处理事务管理

我想如果第二步2失败,那么所有的治疗被取消(回滚)。我该怎么办??

我有下面的示例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> 

谢谢!

+0

看到这个。这可能会产生一个想法。 http://stackoverflow.com/questions/14369876/spring-batch-and-xa-and-local-transactions –

回答

2

不能回滚已经提交的数据(每块之后 - 根据您completition政策 - 您的数据,只要弹簧批量元数据上犯下),所以你不能自动回退所有在步骤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步要删除的数据。

+0

另外检查http://stackoverflow.com/questions/19031186/spring-batch-one-transaction-over-whole-job –

+1

谢谢,我的灵感来自你的答案。 –

0
+0

谢谢你的回复,我使用单个数据库(数据源),我不认为我需要XA事务?在第二个链接上,我已经看到了,但是他没有提到我的情况:如果第2步失败,请回滚步骤1 ... –

+0

我尝试使用同一个事务管理器中的步骤1和步骤2的方法! ? –

+0

阅读我对我的回答的评论;整个tx管理实在是一个坏主意! –