2012-08-13 2 views
1

각기 다른 서버에서 실행되는 Windows 서비스의 인스턴스가 여러 개 있습니다. 각 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

"레코드를 선택합니다"코드를 게시 할 수 있습니까? 문제는 동기화 문제처럼 들리지만 코드가 없으면 추측 할 수 없습니다. – joergl

+0

당신은 어떤 종류의 기록을 말하고 있습니까? 이것은 파일 레코드 또는 데이터베이스 테이블의 레코드입니까? 당신이 사용하고있는 서비스에 대한 코드 예제가 있습니까? 당신은 당신의 프로세스에 대한 더 자세한 정보를 필요로합니다. – MethodMan

+0

데이터베이스 테이블 레코드입니다. – user1208862

답변

0

데이터베이스에서 고유 식별자 열을 사용하십시오. 시작시 각 서비스가 자체 GUID를 생성하도록하십시오.

차 키를 가정하는 ID이고 GUID 열은 파라미터를 전달하기 다음의 SQL과 행을 업데이트

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

을 LOCKGUID @MYGUID 및 @ID

되고, SQL 다음의 변형을 사용하여 행 페치
Update mytable set [email protected] where LOCKGUID is null and [email protected] 

이제 제로는 결과가 나타나면 기록

Select id,field1,field2... from mytable where [email protected] and [email protected] 

를 얻을 수 다른 서비스가이 레코드를 먼저 요구할 때 1 단계에서 다시 루프해야합니다.

이 모든 처리를 수행하기 위해 저장 프로 시저를 작성하여 서버로 여러 번 왕복 할 필요가 없습니다.

+0

다른 질문이 있습니다. 서비스가 레코드를 요청하고 처리 중간에 중단되면 어떻게해야합니까? 이미 청구되었지만 완전히 처리되지 않은 기록을 처리 할 수 ​​있습니까? – user1208862