我有多个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
}
}
}
答案 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步循环,因为另一个服务首先声明此记录。
您可以编写一个存储过程来为您执行所有这些处理,从而无需多次往返服务器。