SQL CLR - lock语句有什么区别吗?

时间:2010-03-03 06:40:19

标签: c# sql-server sql-server-2005 sql-server-2008

我编写了以下代码(sql clr存储过程),它将消息写入本地文件。当多个连接同时调用存储的proc时,会发生此问题。所以我使用了锁定语句。但这似乎没有任何区别?我在这里做错了什么?

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 :(得分:7)

锁定语句本身并不保护任何东西。只有当所有线程都锁定同一个对象时才会发生魔力。在您的情况下,每个线程锁定自己的上下文管道,行为将与锁定相同或不相同。

此外,CLR过程可以在SQL内部完成所有损坏,劫持SQL工作者在Sleep()中等待绝对是一个顶级攻击者。我希望你只将它用于实验目的。

实现你可能想要的东西,即。只有一个程序随时执行,使用应用程序锁:sp_getapplock。在T-SQL sp_getapplock / sp_releaseapplock中包装CLR过程调用,或者在CLR代码的上下文连接上执行sp_getapplock(并在出路时执行sp_releaseapplock)。