使用SQL Server和ASP.NET的生产者 - 消费者问题

时间:2011-03-01 07:50:09

标签: asp.net sql-server

经典的生产者 - 消费者问题。

我有x app服务器,它在DB表(相同的DB)中写入记录。

在每台服务器上,正在运行一个服务,该服务轮询数据库表,并且应该读取最旧的条目,处理它并删除它。 现在的问题是服务进入竞争状态:服务器A上的服务开始读取,服务器B开始读取相同的记录。我有点坚持这个......我经常实施生产者 - 消费者,但从不跨越服务器障碍。

除了数据库之外,服务器不能相互通信。

环境是SQL Server 2005和ASP-NET 3.5。

1 个答案:

答案 0 :(得分:4)

如果您以事务方式工作,只有一台服务器可以选择它:

set transaction isolation level repeatable read

update  top 1 tbl
set     ProcessingOnServer = HOST_NAME()
from    YourWorkTable tbl
where   ProcessingOnServer is null
        and Done = 0

现在您可以选择详细信息,知道工作项已安全地分配给您:

select  *
from    YourWorkTable tbl
where   ProcessingOnServer = HOST_NAME()
        and Done = 0

函数host_name()返回客户端名称,但如果您认为它更安全,则可以从客户端应用程序传入主机名。

我们通常会添加时间戳,因此您可以检查处理项目花费时间过长的服务器。