2011-12-12 128 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解决方案。这将通过您的代码序列化访问:第二个进程可以等待或超时等,具体取决于您如何设置参数