2011-10-18 3 views
1

SQL Server Service Broker를 사용하는로드가 많은 응용 프로그램을 작성하고 있습니다. 나는 Management Studio에서 다음 스크립트를 실행하는 데 1 분 6 초가 걸리는 상태에 처해 있습니다. 응용 프로그램을 중지 한 후에도 마찬가지입니다. 왜 그렇게 오래 걸릴 수 있습니까? TIMEOUT이 0.5 초 후에 멈출 거라고 생각 했나요?Service Broker Receive가 지정된 제한 시간보다 오래 걸리는 이유는 무엇입니까?

WAITFOR (RECEIVE TOP(1) * FROM [targetqueuename]), TIMEOUT 500; 
SELECT @@ERROR; 

@@ ERROR가 0을 반환합니다.이 긴 시간을 처음 실행 한 후에는 하위 순차 실행이 즉시 반환됩니다.

답변

3

WAITFOR(RECEIVE), TIMEOUT 실제로 RECEIVE를 한 번 이상 실행하여 작동합니다. 결과 세트가 비어 있으면, 계속 대기합니다. 그것이 성공할 수 있다고 믿을 때마다 (더 많은 메시지가 있음을 내부적으로 통지 받음) RECEIVE를 다시 실행합니다. 행을 반환하거나 시간이 초과 될 때까지 루프에서 반복합니다.

하지만이 루프 내부에서 이미 실행중인 RECEIVE가 시간 초과로 인해 중단되지 않습니다. 대기열에서 메시지를 찾기 위해 RECEIVE가 오래 걸리는 경우 (큰 대기열 또는 RECEIVE에 대한 잘못된 실행 계획으로 발생할 수 있음) 시간 초과를 사용할 수 없습니다. RECEIVE가 이 아니고이 아닌 메시지를 찾은 경우에도 대기열에 많은 수의 모든 메시지가 잠겨있을 수 있습니다 (보다 정확하게는 잠긴 대화 그룹에 모두 속함). 이 경우 RECEIVE는 실행하는 데 오랜 시간이 걸릴 수 있으며, 잠금 해제 된 대화 그룹을 찾으면 결국에는 빈 손으로 처리됩니다.