我們都知道 Spring Batch 有 2 種任務方式。
主要是在 Step 階段,在 Step 階段,我們可以執行一個 Tasklet,我們也可以按照 Chunk 來執行。
主要差別
如果使用 Tasklet 的話,我們可以一個 Step 對應一個 Tasklet,Spring Batch 不允許一個 Step 對應多個 Tasklet。
考慮有一個場景,我們需要使用 Spring Batch 對資料庫中的表進行更新,這個表可能每次 Batch 要更新 幾千條資料,需要滿足每 5 分鐘更新一次。
如果我們采取 Tasklet 的方式的話,正常的思維都是讀取需要更新的資料,然後逐條進行更新。
這個沒有問題吧,但是恰恰問題就在這裡。
問題就是在 Spring Batch 使用的事務,Tasklet 在啟動的時候會建立一個事務,那麼讀取 1000 條資料,處理 1000 條資料,寫入 1000 條資料都在一個事務裡面。
假設這個處理時間超過 5 分鐘,下一次的任務又開始啟動了,這個時候 Spring Batch 還會啟動一個事務。
假設 10 分鐘了,我們還是沒有完成,Spring Batch 會繼續啟動任務和建立事務。
結果是什麼,這個顯而易見了,就是出現事務堆積,導緻鎖表,然後所有的任務都失敗,無法完成。
針對這種場景,我們就需要 chunk 了。
chunk
Chunk 的主要目的就是為了告訴 Spring 一次執行幾條記錄。
我們如果設定 Chunk 為 1 的話,那麼 Spring Batch 每次讀取一條記錄,處理一條記錄,寫入一條記錄,然後将這個事務進行送出。
這樣的話,可以有效的避免事務堆積導緻的鎖表。