2011-02-07 1 views
1

기본적으로 트랜잭션 내의 여러 테이블에 대해 여러 가지 정리 작업을 수행하는 장기 실행 SP가 있습니다 (최대 몇 분 동안 실행될 수 있음). SP가 현재 수행중인 프로세스의 단계에서 사람이 읽을 수있는 상태 정보를 호출자에게 다시 전달하는 가장 좋은 방법을 결정하려고합니다.저장 프로 시저의 상태 정보를 트랜잭션 내부의 호출자에게 전달합니다.

전체 SP가 단일 트랜잭션 내에서 실행되므로이 ​​정보를 상태 테이블에 다시 기록한 다음 NOLOCK을 사용하여 읽지 않는 한 다른 스레드에서 읽을 수는 없습니다. 이후 최후의 수단으로 생각합니다 :

  • NOLOCK은 다른 데이터 불일치 문제를 일으킬 수 있습니다.
  • 이것은 테이블 또는 행이 잠시 동안 잠길 수 있기 때문에 NOLOCK을 사용해야하는 상태 테이블을 읽으려는 사람에게 부담을줍니다.

트랜잭션 내에서 단일 명령 (또는 EXEC 두 번째 SP)을 실행하고 특정 명령이 트랜잭션의 일부가 아니도록 지정하는 방법이 있습니까? 아니면 ADO.NET이 장기 실행 SP에 대한 통찰력을 얻어 현재 수행중인 작업을 확인할 수있는 다른 방법이 있습니까?

답변

3

당신은 T-SQL에 메시지를 인쇄하고 그들에게 "InfoMessage"이벤트를 통해 ADO.NET에도록 SqlConnection에 전달 얻을 수 있습니다. 자세한 내용은

http://msdn.microsoft.com/en-us/library/a0hee08w.aspx

를 참조하십시오.

+1

+1'PRINT'는 기본적으로 심각도가 0 인 RAISERROR이므로이 이벤트에 가입하면 두 방법 모두에서 작동합니다. –

+0

그게 정확히 내가 필요로하는 것, 감사합니다 ... –

3

절차 내에서 RAISERROR (심각도 10 이하 사용)을 사용하여 정보 메시지를 반환 할 수 있습니다.

예 :

RAISERROR(N'Step 5 completed.', 10, 1) WITH NOWAIT; 
+0

+1'... WITH NOWAIT;을 추가 할 수도 있습니다. –

+0

@Martin : 좋은 지적입니다. 추가됨. –

+0

감사합니다 Joe/Martin, RAISERROR/NOWAIT에 InfoMessage 이벤트가 추가 된 것처럼 보입니다. –