2

我有多个 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
         }
    }
}
4

1 回答 1

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 循环,因为另一个服务首先声明了此记录。

您可以编写一个存储过程来为您完成所有这些处理,从而消除多次往返服务器的需要。

于 2012-08-13T11:56:25.260 回答