我們有大約7個運行.NET Windows服務的應用服務器,它們可以ping一個sql server 2005隊列表並獲取固定數量的記錄以固定的時間間隔進行處理。要處理的記錄數量和提取之間的時間量都是可配置的,最初初始設置爲100和30秒。我們有多個應用服務器針對單個數據庫運行。我如何確保隊列表中的每一行只處理一次?
目前,我的隊列表有一個int狀態列,它可以是「就緒,處理,完成,錯誤」。獲取記錄的proc在事務中使用以下代碼執行sql事務:
1)將x個記錄存入狀態爲「就緒」的臨時表中。選擇使用HOLDLOCK提示
2)更新在隊列表後面的「處理」這些記錄的狀態
的.NET服務做到這一點可能需要秒鐘或每記錄甚至幾分鐘一些處理。另一個過程稱爲每個記錄,只是將狀態更新爲「完成」。更新過程沒有事務,因爲我依靠隱式事務作爲更新子句的一部分。
我不知道這個流量異常,但數字是每天不到10K條記錄。
這是處理這種情況的最佳方法嗎? 如果是這樣,是否有我遺漏的任何細節,如在這裏或那裏的提示?
謝謝! Dave
+1有趣的問題 – CResults 2010-03-19 00:40:09