2008-10-30 9 views
4

MSSQL에 큐와 같은 데이터베이스 테이블 2005 여러 응용 프로그램이 테이블을 작성하고, 하나의 응용 프로그램은 FIFO 방식으로 읽고 처리되어 작은 시스템이 있습니다.병렬 처리

나는 그것을 조금 더 고급 여러 처리 응용 프로그램을 실행할 수있는 분산 시스템을 만들 수 있도록해야한다. 결과는 2-10 처리 응용 프로그램을 실행할 수 있어야하며 작업 중에 서로 간섭하지 않아야합니다.

제 아이디어는 프로세스가 이미 작업 중임을 나타내는 행으로 큐 테이블을 확장하는 것입니다. 처리 응용 프로그램은 먼저 IDetifyer로 테이블을 업데이트 한 다음 업데이트 된 레코드를 요청합니다.

그래서 이런 식으로 뭔가 :

start transaction 
update top(10) queue set processing = 'myid' where processing is null 
select * from processing where processing = 'myid' 
end transaction 

처리 후에는 '완료', 또는 무엇이든처럼, 뭔가 다른 테이블의 처리 열을 설정합니다.

이 접근법에 대해 3 가지 질문이 있습니다.

첫 번째 :이 양식에서 사용할 수 있습니까?

둘째 : 작동하는 경우 효과적입니까? 그런 배포판을 만드는 다른 아이디어가 있습니까?

셋째 행은 록킹 기반하지만, 열의 양이 고정 된 후, 로크 전체 테이블로 확장 MSSQL있다. 따라서 첫 번째 응용 프로그램이 트랜잭션을 릴리스하지 않는 한 두 번째 응용 프로그램은이를 액세스 할 수 없습니다. 테이블 전체를 잠그지 않고 행 잠금 만 생성하려면 선택 (top x)을 얼마나 크게 할 수 있습니까?

답변

6

대답,하지만 당신은 아마 당신이 차단 또는 교착 경우에 실행하겠습니다 찾을 수 있습니다 여러 프로세스가 동일한 데이터를 읽고/업데이트합니다. 이 시스템이 블록킹이나 교착 상태없이 실행될 수 있도록 몇 가지 흥미로운 잠금 의미 체계를 사용하는 시스템 중 하나에 대해 정확히 수행 할 절차를 작성했습니다 (described here).

+0

이것은 매우 좋으며 정확히 내가 필요한 것입니다. 감사. – Biri

+0

니스. 나는 흥미가있을 것이라고 말했다 ;-) – philsquared

+0

주의해야 할 것은 시스템이 정보를 대기열에서 제외하지만 처리하기 전에 충돌/중지하는 처리되지 않은 코드이다. 작업을 다시 큐업하기 전에 타임 아웃하면 문제를 해결할 수 있지만 상당히 엉망이 될 수 있습니다. – mjallday

1

이 방법은 나에게 합리적으로 보이며 이전에 사용한 것과 비슷합니다. 업데이트 및 선택 작업이 수행하면서

또한, 행/테이블은 잠금 상태가됩니다, 그래서 테이블 질문 대 행이 정말 중요한 고려 사항이다 의심한다. 앱 프로세싱 오버 헤드를 무시할 수, 나는 낮은 "최고"값을 유지하는 것 정도로 낮은 경우를 제외하고

은 - 아마도 단지 1 물론 전적으로 귀하의 응용 프로그램의 세부 사항에 따라 달라집니다.

모든 것을 말해 두 겠는데, 난 DBA 아니에요, 그래서 또한 더 이상의 전문가에 관심이있을 것이다이 작동

1

잠금에 관한 질문. 당신은 행

update mytable with (rowlock) set x=y where a=b 
+0

예, 알지만, 잠시 후에 테이블 잠금으로 전환됩니다. 나는 이것이 속도에 대한 고려에 달려 있다고 생각한다 : 행 잠금 목록을 유지하고 처리하는 대신 테이블을 잠그는 것이 가치가있다. – Biri

+1

AFAIK rowlock은 힌트입니다. SQL이 잠금을 행 레벨로 제한하도록 강요하지 않지만 행 잠금이 페이지 잠금 또는 테이블 잠금보다 우선 함을 나타냅니다. SQL은 여전히 ​​자신의 재량에 따라 페이지 잠금 테이블 잠금을 소멸시킵니다. –

1

이 방법의 가장 큰 문제는 테이블에 '업데이트'의 수를 늘리는 것입니다을 잠그는 강제로 잠금 힌트를 사용할 수 있습니다. 하나의 프로세스 (업데이트 + 삭제)를 소비하는 프로세스와 테이블에 데이터를 삽입하는 프로세스 만 있으면이 작업을 시도해보십시오. 약 백만 건의 레코드에서 무너지기 시작합니다.

DB에 대해 하나의 소비자가 있고 다른 소비자에게 처리 데이터를 전달하기 위해 메시지 대기열을 사용하고 싶습니다.