2010-03-03 4 views
0

로컬 파일에 메시지를 쓰는 다음 코드 조각 (sql clr 저장 프로 시저)을 작성했습니다. 다중 연결이 저장된 proc을 동시에 호출 할 때 문제가 발생합니다. 그래서 나는 lock 문을 사용했다. 그러나 이것은 어떤 변화도없는 것처럼 보입니다. 여기서 내가 뭘 잘못하고 있니?SQL CLR - 잠금 문이 변경됩니까?

lock (SqlContext.Pipe) 
{ 
    StreamWriter sw = File.AppendText("C:\Date.txt"); 
    int y = 50; 

    while (y != 0) 
    { 
     sw.WriteLine(DateTime.Now + " " + serverName + " -- " + jobId.ToString()); 
     System.Threading.Thread.Sleep(new Random().Next()); 
     y = y - 1; 
    } 
    sw.Close(); 

} 
+1

상당히 고급 코드를 시도하는 것 같습니다. 이것이 실제로 달성하려는 목표를 달성하는 가장 간단한 방법입니까? 해결하려는 문제는 정확히 무엇입니까? –

+0

이 제공 한 코드에서 저장 프로 시저가 호출되거나 액세스되지 않습니다. – HotTester

+0

@HotTester,이 코드는 SQL CLR 저장 프로 시저에서 실행됩니다. –

답변

7

독자적으로 lock 문은 아무 것도 보호하지 않습니다. 모든 스레드가 같은 객체을 잠그는 경우에만 마법이 발생합니다. 당신이 경우, 각 스레드가 자체 컨텍스트 파이프를 잠그면, 동작은 잠금 여부와 동일하게됩니다.

게다가 SQL 내에서 CLR 프로 시저가 수행 할 수있는 손상으로부터 SQL 작업자를 절취하여 Sleep()에서 기다리는 것은 분명히 최고의 범죄자입니다. 실험적인 목적으로 만 사용하기를 바랍니다.

아마도 당신이 원하는 것을 달성하십시오. 언제든지 하나의 절차 만 실행하면 응용 프로그램 잠금 (sp_getapplock)을 사용하십시오. CLR 프로 시저 호출을 T-SQL sp_getapplock/sp_releaseapplock으로 감싸거나 CLR 코드의 컨텍스트 연결에서 sp_getapplock을 실행하십시오 (그리고 나갈 때 sp_releaseapplock을 실행하십시오).