我有一个存储过程SELECT
表中的TOP 1
记录,并为列分配了一些变量。然后是SELECT
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
,我希望它们在一个结果集中,以便第二个线程将拿起不同的价值。这是我遇到问题的地方。我试图在第一个HOLDLOCK, UPDLOCK, ROWLOCK
语句中使用SELECT
提示,但这会锁定第一个记录并允许另一个线程获取我在第一个线程中所需的下一个值。我还在存储过程中启动了TRANSACTION
并将ISOLATION LEVEL
更改为READ COMMITTED
,但第二个线程始终进入并在第一个线程可以{{1 SELECT
匹配的10条记录。
有没有人对我应该怎么做才有任何想法?这种方法可行吗?
答案 0 :(得分:1)
你的方法看起来很奇怪:从同一张桌子中选择TOP,没有ORDER BY等。
如果没有任何其他信息,并且假设您希望保留相同的解决方案,则必须使用sp_getapplock的信号量解决方案。这将通过您的代码序列化访问:第二个进程可以等待或超时等,具体取决于您设置参数的方式