2013-09-26 168 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管理實在是一個壞主意! –