我有一个表,它有点像一个队列,除了记录永远不会从表中删除。我试图尝试让存储过程返回一条当前未从前端应用程序处理的记录。我们所拥有的是我们设置的“锁定”列来指示这一点。我们这样做的原因是每次只有一个呼叫中心代理可以处理记录。到目前为止,这是我的 sql 的样子。问题是,如果我从两个单独的会话(第二个会话注释掉 waitfor 语句)运行此查询,则第二个会话在 10 秒内不返回任何记录。选择记录时,我已将其范围缩小到 order by 子句。如果我删除 Order By 它会返回,但我需要 order by。
或者也许我的查询完全错误?我应该使用事务隔离级别(可序列化、快照)吗?任何指导都会很棒!
DECLARE @WorkItemId INT;
BEGIN TRANSACTION
/* TODO: Skip Records That Have Been Completed. */
SET @WorkItemId = (SELECT TOP 1 CampaignSetDetailId FROM CampaignSetDetail WITH (XLOCK, READPAST) WHERE LockedBy IS NULL ORDER BY NEWID(), NumAttempts ASC);
/* */
UPDATE CampaignSetDetail SET LockedBy = 'MPAUL', LockedDTM = GETUTCDATE() WHERE CampaignSetDetailId = @WorkItemId;
/* */
SELECT * FROM CampaignSetDetail WHERE CampaignSetDetailId = @WorkItemId;
WAITFOR DELAY '00:00:10';
COMMIT TRANSACTION