我编写了以下代码(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();
}
答案 0 :(得分:7)
锁定语句本身并不保护任何东西。只有当所有线程都锁定同一个对象时才会发生魔力。在您的情况下,每个线程锁定自己的上下文管道,行为将与锁定相同或不相同。
此外,CLR过程可以在SQL内部完成所有损坏,劫持SQL工作者在Sleep()中等待绝对是一个顶级攻击者。我希望你只将它用于实验目的。
实现你可能想要的东西,即。只有一个程序随时执行,使用应用程序锁:sp_getapplock
。在T-SQL sp_getapplock
/ sp_releaseapplock
中包装CLR过程调用,或者在CLR代码的上下文连接上执行sp_getapplock
(并在出路时执行sp_releaseapplock)。