我使用 SQL Server 2008 R2 作为排队机制。我将项目添加到表中,然后外部服务读取并处理这些项目。这很好用,但缺少一件事 - 我需要一种机制,可以尝试从表中选择一行,如果没有,则阻塞直到有(最好是在特定的时间段内)。
任何人都可以建议我如何实现这一目标吗?
最佳答案
实现非池化阻塞出队的唯一方法是 WAITFOR (RECEIVE)
。这意味着 Service Broker 队列,以及所有增加的开销。
如果您使用普通tables as queues您将无法实现非轮询阻塞。您必须通过请求出列操作来轮询队列,如果它没有返回任何内容,请休眠并稍后重试。
恐怕我会不同意安多马尔的观点:虽然他的回答是一个通用问题“表中有行吗?”当涉及到排队时,由于重叠入队/出队的繁忙性质,检查这样的行在负载下(几乎)肯定会出现死锁。当谈到使用表作为队列时,必须始终坚持基本的入队/出队操作,不要尝试花哨的东西。
关于SQL Server,使用表作为队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4686726/