2010-03-03 20 views
0

我寫了下面這段代碼(sql clr存儲過程),它將消息寫入本地文件。多個連接同時調用存儲過程時會發生此問題。所以我使用了鎖定語句。但是這似乎沒有什麼區別?我在這裏做錯了什麼?SQL CLR - lock語句是否有所作爲?

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

鎖定聲明本身並不保護任何內容。只有當所有線程鎖定相同的對象時,纔會發生奇蹟。在你的情況下,每個線程都鎖定它自己的上下文管道,行爲將相同或不相關。

此外,CLR過程可以在SQL內部完成的所有破壞中,劫持SQL worker以在Sleep()中等待是絕對的最高罪犯。我希望你只將它用於實驗目的。

爲了實現你可能想要的,即。只有一個程序可以隨時執行,請使用應用程序鎖定:sp_getapplock。在T-SQL sp_getapplock/sp_releaseapplock中包裝CLR過程調用,或者在CLR代碼的上下文連接上執行sp_getapplock(並在出路時執行sp_releaseapplock)。