2011-03-09 49 views
0

衆所周知,Spring批處理自2.0版以來使用面向塊處理。Spring批處理面向塊處理策略的回滾機制

這是否意味着,如果在項目編寫器中發生異常,數據源事務管理器將回滾整個塊或僅回滾相關項目?

其實,我試了一下,看到框架回滾了整個塊。這不是我所需要的,因爲我不想讓那些已經成功處理的499個項目在包含500個項目的塊中回滾,而最後一個項目導致拋出異常。

我能找到的唯一解決方案是將以下屬性添加到我的tasklet。但是,我不確定這是否正確。

<batch:transaction-attributes propagation="NOT_SUPPORTED"/> 

另一種觀點是簡單地將塊大小減小到1(一),但那個也沒有多大意義。

也許Spring Batch不適合我的問題域。如果是這樣,請告訴我,這樣我就不會再爲這種框架特定的行爲而苦苦掙扎。

任何建議將不勝感激。

回答

0

你的權利:整塊大塊被回滾。

我面臨同樣的問題,做了以下內容:

  • 根據數據庫適應批量大小(我是用批處理語句來拯救我的更新)。對我們來說,25是一個很好的價值:優於1(批量收益),而不是太多(鉅額交易)。
  • 重新啓動此步驟的有限時間:我們啓用了最多重新執行此任務3次。

這很好,因爲在批處理過程中可能會發生更正(由GUI完成更正)。

在我們的流程結束時,標記爲失敗並重試3次的所有數據在我們的批處理報告中被明確標記爲失敗:然後需要人工更正或特殊處理。

0

解決方案可能是停止在writer中傳播異常並捕獲它。這將防止批處理在您捕獲異常並執行自定義處理時回滾。

0

您可以使用Propagation.REQUIRES_NEW在writer方法內打開不同的事務來處理此用例。