2015-12-02 23 views
1

注意 - 此問題擴展爲對另一個問題here的回答。在多線程環境中原子更新DB字段的計數

我正在通過將文件分成更小的組和導入每個塊(100行)的後臺作業來將文件導入到我的數據庫中。

我想要一種方法來跟蹤到目前爲止導入了多少塊的進度,所以我已經計劃在每個作業上將數據塊字段遞增1,這樣我知道已經處理了多少塊。

這有兩個並行作業同時遞增數據庫字段1和互相覆蓋的潛在情況。

避免這種情況並確保原子並行操作的最佳方法是什麼?上面的鏈接帖子建議使用Redis,這是一種好方法。對於這個問題我很好奇,如果有一種替代方法來使用持久性存儲。

我使用Rails的ActiveRecord與Postgres作爲我的數據庫。

謝謝!

回答

2

我建議不要將數據庫字段增加1,而應爲具有作業ID的每項作業創建數據庫記錄。有兩個好處:

  1. 您可以計算記錄的數量,讓您知道已處理的數量,而不必擔心並行操作。
  2. 您還可以將一些必要的日誌添加到每個作業記錄中,並在導入時任何作業失敗時輕鬆進行調試。
0

我建議你使用postgresql序列。

參見CREATE SEQUENCESequence Manipulation。 特別是nextval()

將序列對象前進到下一個值並返回該值。這是自動完成的:即使多個會話同時執行nextval,每個會安全地接收不同的序列值