我在存储过程中使用UPDLOCK和READPAST sql提示以实现一种表队列(我说排序因为我选择前1500而不是前1,我不会删除后面的行选择它们.有关更多详细信息,请参阅"选择顶部n"查询中的返回未锁定行的问题.
我用一个简单的小表做了一些测试,一切似乎都很好 - SP的第二次调用不等待第一次调用结束,只是跳过第一次调用锁定的行,然后返回下一行.在我的真实桌子上,虽然,它有时只能工作......其他时候,第二个呼叫挂起并等待第一个呼叫结束.这是因为第一次调用会锁定整个表,而不仅仅是某些行.
这些是测试表和真实表的SP:
真表:
declare @temp as table (ID int primary key, timestamp datetime)
BEGIN TRANSACTION
insert into @temp
SELECT TOP 1 ID, getdate()
FROM subscription WITH (UPDLOCK, READPAST)
WHERE IsBeingProcessed = 0
waitfor delay '00:00:10'
UPDATE subscription
SET IsBeingProcessed = 1
from subscription
inner join @temp t on subscription.id = t.id
COMMIT TRANSACTION
select * from @temp t
inner join subscription s on s.id = t.id
Run Code Online (Sandbox Code Playgroud)
测试表:
declare @temp as table (ID int primary …
Run Code Online (Sandbox Code Playgroud)