Sql 使用锁和有序输出更新数据库队列

Sql 使用锁和有序输出更新数据库队列,sql,sql-server,database,Sql,Sql Server,Database,我有一个数据库队列,包含两个表,meta和data。storec进程锁定100行,更新行的状态并返回元数据。我有一个windows服务正在执行存储过程 存储过程 update top(100) QueueMeta WITH (UPDLOCK, READPAST) SET Status = 'processing' OUTPUT inserted.Id, inserted.CreatedOn, inserted.Timeout, qd.Mess

我有一个数据库队列,包含两个表,meta和data。storec进程锁定100行,更新行的状态并返回元数据。我有一个windows服务正在执行存储过程

存储过程

update top(100) QueueMeta WITH (UPDLOCK, READPAST)
SET Status = 'processing'
OUTPUT inserted.Id, 
        inserted.CreatedOn, 
        inserted.Timeout, 
        qd.Message,
        qd.Msisdn,
        inserted.NrOfRetries,
        inserted.MaxNrOfRetries             

FROM QueueMeta qm
INNER JOIN QueueData qd
    ON qm.Id = qd.QueueMetaId
WHERE Status = 'readytosend' and SendOn <= CURRENT_TIMESTAMP
使用(UPDLOCK,readpass)更新top(100)QueueMeta
设置状态='正在处理'
输出插入.Id,
插入.CreatedOn,
插入。超时,
qd.信息,
qd.Msisdn,
插入第3部分,
inserted.maxnrofreies
来自QueueMetaQM
内部连接队列数据qd
在qm.Id=qd.QueueMetaId上

如果Status='readytosend'和SendOn那么,您可以使用一个表类型的变量来选择具有排序功能的条目。还请注意,必须在from子句中使用(UPDLOCK,readpass)提示,以避免并发更新,如果发生这些更新,将改变所选记录的状态

DECLARE @Dequeued TABLE (
    Id BIGINT/INT PRIMARY KEY,
)

INSERT INTO @Dequeued
SELECT TOP (100)
    Id
FROM QueueMeta WITH (UPDLOCK, READPAST)
WHERE
    Status = 'readytosend' AND
    SendOn <= CURRENT_TIMESTAMP
ORDER BY Prio DESC

UPDATE qm
SET
    Status = 'processing'
OUTPUT
    INSERTED.Id, 
    INSERTED.CreatedOn, 
    INSERTED.Timeout, 
    qd.Message,
    qd.Msisdn,
    INSERTED.NrOfRetries,
    INSERTED.MaxNrOfRetries
FROM QueueMeta qm
INNER JOIN @Dequeued d
    ON d.Id = qm.Id
INNER JOIN QueueData qd
    ON qd.QueueMetaId = qm.Id
DECLARE@Dequeued表(
Id BIGINT/INT主键,
)
插入到@Dequeued
选择顶部(100)
身份证件
来自QueueMeta(UPDLOCK,READPAST)
哪里
状态='readytosend'和

Send根据您的需要,您可以使用sql Server自己的锁定机制“sp_getapplock”来序列化对关键节或存储过程的访问。现在返回数据的顺序是什么?它应该是主键顺序。也许还可以给我们看一下表定义。根据定义,顺序是不可预测的,因为没有order By。其实这并不重要,我需要按Prio(元表上的一个int)排序,它不是主键。