2

それぞれが異なるサーバーで実行されている Windows サービスの複数のインスタンスがあります。テーブル内にレコードが見つかると、それぞれの Windows サービスが開始されます。期待される機能は、Windows サービスの 1 つがレコードを選択した場合、他の 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 を生成するようにします。

主キーがidで、guid列がLOCKGUIDであると仮定して、次のSQLの変更を使用して行をフェッチします

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 に答える