2011-10-11 218 views
0

假設批處理作業運行時拾取這100個記錄然後開始處理時,數據庫中有100條記錄。在處理過程中,如果第10條記錄發生錯誤,那麼我應該回滾已經處理的所有9條記錄。批處理作業事務處理

我們如何設計這個場景?歡迎您的建議。

回答

0

我相信你問的是如果你應該回滾成功的記錄,如果通過批處理中途出現錯誤。

您希望在事務中發生數據庫更新,以便在每次事務提交或回滾之後使數據庫記錄保持一致且合法(與數據庫和業務規則相關)。

如果您的100條記錄列表中的每個條目都可以單獨進行處理和記錄,那麼我建議使用某種標誌(也可以是一個狀態字段)來指示是否處理了每條記錄,然後遍歷記錄來更新每個記錄。如果遇到錯誤,請注意某處(日誌文件,異常,錯誤表......您的調用)並繼續前進。完成後,您將記錄哪些記錄成功,哪些失敗。然後,您應該能夠返回並修復造成壞記錄問題的任何內容,並重新處理跳過的記錄。

如果您的所有記錄都必須一起成功或失敗,那麼您需要將更新包裝在一個事務中,以便它們都成功或失敗。這將適用於數十條記錄或(可能)數百條記錄,但在同一事務中嘗試擴展到數千條記錄可能會導致可伸縮性問題(性能和爭用問題),因此您需要針對模式的不同解決方案像那樣。

+0

感謝您的回答,實際上我只是實現了這種方式。我正在和其他專家一起檢查他們是如何進行這種處理的,最好的辦法是什麼......謝謝 –

0

可能存在不同的事務粒度。 Java(JTA)允許在單次提交中進行多次寫入。

  1. Open事務
  2. 寫記錄
  3. 寫記錄
  4. 寫記錄
  5. 錯誤
  6. 回滾

大多數數據庫還支持可以處理多行交易或記錄寫入。

這是很常見的。

+0

回滾所有成功的記錄是否好?在你的例子中,直到第4點一切都很好,錯誤發生在第5點,現在你想要回滾所有成功的記錄?你認爲如果我們提交所有成功的記錄並將它們標記爲由某個標記執行,那麼下一次批量作業可以吸收剩餘的記錄(點5)。我的問題基本上是什麼設計這種情況下最好的方法?我們是否應該創建批量大小,然後只回滾失敗批次,或者我們應該創建保存點,然後回滾到保存點? –

0

看看SAVEPOINTS - 他們基本上允許內部交易交易。所以你可以做很多工作,做一個SAVEPOINT,做更多的工作,只回滾到最後的保存點。如果事情真的發生了錯誤,那麼您可以將整個事務回滾。

+0

最初我通過Java嘗試了SAVEPOINTS(我沒有存儲過程),但是我的情況並沒有而且它還需要更多的代碼和邏輯,然後在數據庫表中使用狀態列來維護...還看到了一種性能問題......感謝您的建議Mike ... –