Windows服务的多个实例的问题

时间:2012-08-13 11:08:28

标签: c# web-services windows-services

我有多个Windows服务实例,每个实例都在不同的服务器上运行。每个Windows服务在表中找到记录时都会启动。 现在预期的功能就是这样 如果其中一个Windows服务已选择记录,则其他Windows服务不应该拾取相同的记录。 实际功能: 每个Windows服务都应该选择不同的记录。

所有实例都在同时拾取相同的记录并进行处理,这就产生了问题。

有人可以建议解决上述问题吗?

其他细节: 我添加了我们正在检查数据集的代码包含记录(我们之前插入的Windows服务要处理)然后我们执行一些业务,并发送邮件。问题是因为有多个Windows服务实例,我收到多封邮件是不可取的。

DataSet reportsDs  = new DataSet();            
int ReportID = 0;
int MastReptID = 0;
try
{
    reportsDs = stored procedure to get the dataset in which the record is inserted
    if (reportsDs != null && reportsDs.Tables[0].Rows.Count > 0)
    {
        ServiceName.isProcCompleted = false;
        for (int rptcnt = 0; rptcnt < reportsDs.Tables[0].Rows.Count; rptcnt++)
        {
           //some business functions
           //send a mail after finishing the above business process
         }
    }
}

1 个答案:

答案 0 :(得分:0)

在数据库中使用唯一标识符列。 让每个服务在启动时生成它自己的guid。

使用以下SQL的修改获取行,假设主键为id且guid列为LOCKGUID

Select TOP 1 id FROM mytable where LOCKGUID is null ORDER BY id;

现在使用以下SQL更新行,传入参数@MYGUID和@ID

Update mytable set LOCKGUID=@MYGUID where LOCKGUID is null and id=@id 

现在获取记录

Select id,field1,field2... from mytable where LOCKGUID=@MYGUID and id=@ID

如果您收到零结果,则需要再次从第1步循环,因为另一个服务首先声明此记录。

您可以编写一个存储过程来为您执行所有这些处理,从而无需多次往返服务器。