恭喜您开始
SqlDependency工作(我一点也不讽刺,很多人都因此而失败了)。
现在是时候阅读MSDN上的“创建查询通知”主题。您将看到查询对通知有效的条件,包括以下要求:
该语句不得在READ_UNCOMMITTED或SNAPSHOT隔离级别下运行。
我写的如何的基础
SqlDependency工程,也许会澄清一些一些误解。而且,作为辅助节点,由于您使用的是Linq,因此您可能对LinqToCache感兴趣,该工具提供了
Linq查询和之间的桥梁
SqlDependency。
另一个评论:不要
Start()和
Stop()你的
SqlDependency纳利·威利在一起。您很快就会后悔。
Start()应该在应用启动期间被调用一次,而
Stop()在应用关闭期间被调用一次(严格来说,是在应用域加载和卸载期间)。
现在,关于您的问题:重要的隔离级别是 通知的查询之一 。这意味着,在其上附加订阅,查询 不
上你做的查询
UPDATE(我不会做下脏UPDATE的智慧评论读取…或者使用肮脏的啥子东西读)。据我所知,您显示的代码不应将查询发布到read_uncommitted下。发出
SET TRANSACTION ISOLATION...所有后续事务(遍历所有语句)后,该会话中的事务将处于该隔离级别下。您关闭该连接(通过处理DataContext),然后使用其他连接。除非…您使用连接池。欢迎来到无辜受害者俱乐部:)。连接池泄漏跨
Close()/
Open()边界的隔离级别更改。那就是你的问题。有一些简单的解决方案:
- 您可以(必须!)在此之后显式重置隔离级别。
Open()
- 您可以使用System.Transactions范围(我的建议)。强制性阅读:使用新的TransactionScope()被认为有害
- 不要使用连接池。
而且,当我们聊天时,您还需要阅读以下内容:将表用作队列。



