经典的生产者 - 消费者问题。
我有x app服务器,它在DB表(相同的DB)中写入记录。
在每台服务器上,正在运行一个服务,该服务轮询数据库表,并且应该读取最旧的条目,处理它并删除它。 现在的问题是服务进入竞争状态:服务器A上的服务开始读取,服务器B开始读取相同的记录。我有点坚持这个......我经常实施生产者 - 消费者,但从不跨越服务器障碍。
除了数据库之外,服务器不能相互通信。
环境是SQL Server 2005和ASP-NET 3.5。
答案 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()
返回客户端名称,但如果您认为它更安全,则可以从客户端应用程序传入主机名。
我们通常会添加时间戳,因此您可以检查处理项目花费时间过长的服务器。