SQL Server,使用表作为队列

Bar*_*ast 6 sql sql-server queue sql-server-2008

我使用SQL Server 2008 R2作为排队机制.我将项添加到表中,外部服务读取并处理这些项.这很好用,但缺少一件事 - 我需要机制,我可以尝试从表中选择一行,如果没有,则阻塞直到有(优选在特定的时间段内).

任何人都可以建议我如何实现这一目标?

Rem*_*anu 9

实现非池阻塞出列的唯一方法是WAITFOR (RECEIVE).这意味着Service Broker队列具有所有增加的开销.

如果您使用普通表作为队列,则无法实现非轮询阻止.您必须通过请求出列操作来轮询队列,如果它没有返回任何内容,请休眠并稍后再试.

我担心我会在这里不同意Andomar:虽然他的答案是一个普遍的问题,但桌子上有没有排?当涉及到排队时,由于重叠入队/出队的繁忙性质,检查这样的行是一个(几乎)保证在负载下的死锁.当使用表作为队列时,必须始终坚持基本的入队/出队操作,不要尝试花哨的东西.


mci*_*321 7

"自SQL Server 2005引入OUTPUT子句以来,使用表作为队列不再是一个难题".关于如何做到这一点的好文章.

http://rusanu.com/2010/03/26/using-tables-as-queues/

  • 这是一篇很棒的文章,虽然根据http://stackoverflow.com/a/940001/8479,锁定提示不太正确 - 例如需要UPDLOCK (3认同)

And*_*mar 2

我需要一种机制,可以尝试从表中选择一行,如果没有,则阻塞直到有(最好是在特定的时间段内)。

您可以循环并每秒检查新行:

while not exists (select * from QueueTable)
    begin
    wait for delay '00:01'
    end
Run Code Online (Sandbox Code Playgroud)

免责声明:这不是我用于生产系统的代码,但它可以满足您的要求。