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

Pra*_*bhu 0 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();

}
Run Code Online (Sandbox Code Playgroud)

Rem*_*anu 7

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

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

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