2017-08-30 26 views
0

我在作者身上使用了重試彈簧批處理。筆者是這樣的:在彈簧批量寫入器上重試

public class MyWriter implements ItemWriter<MyClass> { 

    @Retryable(maxAttempts=3, [email protected](delay=2000)) 
    public void write(List<? extends MyClass> list) throws Exception { 
    // db operation 1 -- insert query 
    // some business logic 
    // db operation 2 -- update query 
    } 
} 

如果在「DB操作2」,重試異常被稱爲和執行從「DB操作1」再次啓動預期。但是'數據庫操作1'是一個插入查詢,並且這次拋出一個異常,因爲它試圖再次插入相同的記錄(並且DB上的唯一約束失敗)。最終,批次在3次嘗試後失敗,此步驟中沒有任何內容被提交到數據庫。

'db操作1'不應該在重試之前回滾/刷新?這是預期的行爲還是執行有問題?

我使用的是Spring引導應用程序和spring jdbc。

回答

0

不要以這種方式控制重試。使用Spring Batch的重試邏輯。 Spring Batch將回滾事務並以安全的方式重試。你正在做重試的方式,重試不與事務協調,因此你得到重複的記錄(因爲事務沒有回滾)。

+0

這有幫助..謝謝! – Sakshi

0

隨着你的spring jdbc你將使用事務管理器。使用它來控制設置事務邊界並在更新查詢後進行提交。

另請參見this示例描述瞭如何使用事務管理器。

+0

我還沒有配置一個事務管理器,因爲spring批處理自己管理事務。它的事務按預期工作,只有在更新查詢後纔會發生提交。問題在於它考慮到插入已經發生在重試上,即使它還沒有被提交。 – Sakshi