2011-12-12 136 views
0

我有一個存儲過程,SELECT是表中的TOP 1記錄,並將某些變量與列的值進行賦值。然後SELECT s 10記錄Id列的值與TOP 1變量列的值相同。需要鎖定協助

SELECT TOP 1 @Id = [Id] 
    FROM [TableA] 
ORDER 
    BY [DateCreated], [Priority] 

SELECT TOP 10 * 
    FROM [TableA] 
WHERE [Id] = @Id; 

目的是SELECT一個記錄,然後讓10條集的記錄進行處理。這適用於如果一個連接正在調用存儲過程。我有一個應用程序是多線程的,這會導致一個問題,因爲如果第一個和第二個記錄是相同的Id,我希望它們在一個結果集中,以便第二個線程將選擇一個不同的結果集值。這是我遇到問題的地方。我試着在第一個SELECT聲明中使用HOLDLOCK, UPDLOCK, ROWLOCK提示,但是它鎖定了第一條記錄,並允許另一個線程在第一條線程中獲取我想要的下一個值。我也在存儲過程中啓動了一個TRANSACTION,並將ISOLATION LEVEL更改爲READ COMMITTED,但第二個線程總是進入並取得下一個值,然後第一個線程可以匹配Id匹配的10個記錄。

有沒有人有任何想法我應該如何去做呢?這種方法可行嗎?

+0

可能重複的[SQL Server進程隊列爭用條件](http://stackoverflow.com/questions/939831/sql -server-process-queue-race-condition) – gbn

+0

什麼ORDER BY應該適用於查詢?完整的代碼是什麼樣的?桌子是什麼樣的? – gbn

回答

1

你的做法似乎很奇怪:從同一個表,TOP選擇沒有ORDER BY等

在沒有任何其他信息並假設你想保持相同的解決方案,你必須使用一個信號與sp_getapplock解決方案。這將通過您的代碼序列化訪問:第二個進程可以等待或超時等,具體取決於您如何設置參數