Bar*_*ast 6 sql sql-server queue sql-server-2008
我使用SQL Server 2008 R2作为排队机制.我将项添加到表中,外部服务读取并处理这些项.这很好用,但缺少一件事 - 我需要机制,我可以尝试从表中选择一行,如果没有,则阻塞直到有(优选在特定的时间段内).
任何人都可以建议我如何实现这一目标?
实现非池阻塞出列的唯一方法是WAITFOR (RECEIVE).这意味着Service Broker队列具有所有增加的开销.
如果您使用普通表作为队列,则无法实现非轮询阻止.您必须通过请求出列操作来轮询队列,如果它没有返回任何内容,请休眠并稍后再试.
我担心我会在这里不同意Andomar:虽然他的答案是一个普遍的问题,但桌子上有没有排?当涉及到排队时,由于重叠入队/出队的繁忙性质,检查这样的行是一个(几乎)保证在负载下的死锁.当使用表作为队列时,必须始终坚持基本的入队/出队操作,不要尝试花哨的东西.
"自SQL Server 2005引入OUTPUT子句以来,使用表作为队列不再是一个难题".关于如何做到这一点的好文章.
http://rusanu.com/2010/03/26/using-tables-as-queues/
我需要一种机制,可以尝试从表中选择一行,如果没有,则阻塞直到有(最好是在特定的时间段内)。
您可以循环并每秒检查新行:
while not exists (select * from QueueTable)
begin
wait for delay '00:01'
end
Run Code Online (Sandbox Code Playgroud)
免责声明:这不是我用于生产系统的代码,但它可以满足您的要求。
| 归档时间: |
|
| 查看次数: |
19860 次 |
| 最近记录: |