2010-03-18 28 views
4

我們有大約7個運行.NET Windows服務的應用服務器,它們可以ping一個sql server 2005隊列表並獲取固定數量的記錄以固定的時間間隔進行處理。要處理的記錄數量和提取之間的時間量都是可配置的,最初初始設置爲100和30秒。我們有多個應用服務器針對單個數據庫運行。我如何確保隊列表中的每一行只處理一次?

目前,我的隊列表有一個int狀態列,它可以是「就緒,處理,完成,錯誤」。獲取記錄的proc在事務中使用以下代碼執行sql事務:

1)將x個記錄存入狀態爲「就緒」的臨時表中。選擇使用HOLDLOCK提示

2)更新在隊列表後面的「處理」這些記錄的狀態

的.NET服務做到這一點可能需要秒鐘或每記錄甚至幾分鐘一些處理。另一個過程稱爲每個記錄,只是將狀態更新爲「完成」。更新過程沒有事務,因爲我依靠隱式事務作爲更新子句的一部分。

我不知道這個流量異常,但數字是每天不到10K條記錄。

這是處理這種情況的最佳方法嗎? 如果是這樣,是否有我遺漏的任何細節,如在這裏或那裏的提示?

謝謝! Dave

+0

+1有趣的問題 – CResults 2010-03-19 00:40:09

回答

3
+1

+1我不知道!謝謝! – CResults 2010-03-19 00:39:24

+0

謝謝,這是完美的!我有一個有趣的區別,雖然我不認爲改變什麼,但我不確定。我沒有提出我的問題,所以我沒有把這個問題混淆。此外,這是我可以輕鬆還原... – Dave 2010-03-19 15:32:14

+0

而不是一個單一的隊列表,我有一個父表與歷史表,包含狀態。因此,我從不在任何地方進行更新。相反,我只是在歷史表中插入一個新行。然後我使用一個視圖,該視圖使用歷史記錄表對主表進行處理,並將最近的歷史記錄行拖到結果集中。換句話說,這會將burdon推向視圖而不是udpate。 我讀的視圖在文章中使用相同的提示,並且嵌套在同一個事務中。有人認爲這是朝着錯誤的方向邁出的一步嗎? – Dave 2010-03-19 15:33:50

相關問題