2012-12-13 5 views
2

매우 이상한 문제가 발생했습니다. 데이터가 적절하고 적시에 삽입되었지만 저장 프로 시저가 반환되지 않습니다. 이것에 대해 가장 놀라운 것은 데이터가 매우 빠르게 테이블에 들어가는 것처럼 레코드 타임 스탬프 필드가 항상 밀리 초 내에 채워지는 것입니다. 그러나 반환은 결코 일어나지 않는다.저장 프로 시저가 C# 코드로 제어를 반환하지 않습니다.

중요한 점은 부하시에만 발생한다는 것입니다. 개별 요청은 문제가 없습니다. DB가 충분히 강조되었을 때만이 일이 일어나기 시작합니다.

무엇이 잘못 될 수 있는지 거의 이해하지 못했기 때문에 어떤 아이디어라도 환영합니다.

그 다음은 단순화 C 번호 부분 :

try 
{ 
    using (var conn = new SqlConnection(connString)) 
    { 
     conn.Open(); 

     using (var cmd = new SqlCommand(conn, ....) 
     { 
      cmd.CommandType = StoredProcedure; 

      cmd.ExecuteNonQuery(); 

      // THIS NEVER EXECUTES: 
      ReportSuccess(); 
     } 
    } 
} 
catch (TimeoutException) 
{ 
    // EXCEPTION HERE 
} 

그리고 저장 프로 시저 :

CREATE PROCEDURE dbo.Blah 
BEGIN 
    INSERT dbo.MyTable VALUES (...) 

    INSERT dbo.MyTable2... 

    -- Here is where everything stops. 

END 

업데이트 : 우리는 시간 제한 및 SQL 서버 작업의 상관 관계를 알아 최고의했고, 그것은 비 응용 프로그램을 나타납니다 사용자 활동으로 인해 잠금이 발생했습니다. 이 프로세스는 매우 신속한 삽입 및 매우 신속한 판독을 허용하도록 설계되었습니다. 그러나 일부 개인은 DIRTY READ 정책을 사용하지 않고도 상당히 비싼 쿼리를 실행하게됩니다. 그래도 모든 팁 주셔서 감사합니다.

+0

반환 값은 어디입니까? –

+0

값을 반환하지 않습니다. 반환에 의해 나는 SP가 결코 돌아 오지 않는다는 것을 의미하고 예외는 C# 측에 잡힌다는 것을 의미한다. – Schultz9999

+0

ExecuteNonQuery()가 응답하지 않는다는 의미입니까? –

답변

1

제공되는 정보에 따르면 가장 좋은 추측은 저장 프로 시저에 우발적 인 문제가 있다는 것입니다.

저장 프로 시저에서 트랜잭션을 사용해보십시오. 제 이론이 옳다면, 어떤 기록도 삽입되지 않을 것입니다.

MyTable2에서 잠금을 획득했는지 확인하십시오. 다른 곳에있는 테이블에서 큰 선택을하는 경우 nolock을 사용하고 있는지 확인하십시오.

+0

나는 당신의 추론을 이해하지 못합니다. 데이터가 삽입되면 SP가 반환되지 않는 것은 무엇입니까? SP는 문학적 INSERT 문이므로 두 번째 INSERT는 첫 번째 INSERT가 첫 번째 디버거가 완전히 실행되었는지 확인하기위한 디버그였다. 실제로 우리는 두 개의 삽입을 추가했으며, 모두 성공적으로 datetime 값을 가진 레코드를 만들었습니다. – Schultz9999

+0

다음 행이 없습니다. 주 INSERT 다음에 다른 테이블로 제어 된 INSERT. – Schultz9999

+0

이상한!좋아, 그럼 던져진 예외는 무엇입니까? 그것은 내부 캐치 또는 외부 캐치에 걸렸습니까? – humblelistener

관련 문제