试图执行一个LINQ(-to-SQL)查询调试一个艰难的LINQ到SQL超时
System.Data.SqlClient.SqlException时,我得到一个超时错误:超时过期。操作完成之前超时的时间或服务器没有响应。
现在,这是不只是一个缓慢的查询的情况:
- 我在运行SQL Management Studio中相当于SQL并迅速(2秒)完成
- 我设置我的CommandTimeout为2分钟。
- 当我在单元测试中执行完全相同的查询时,它成功并且快速地完成。也就是说:我只是在与其他查询一起运行此查询时才得到此超时。超时总是发生在同一个电话上。
最后一项让我觉得我得到某种数据库端死锁:查询被某处的锁阻塞,超时时间结束,导致连接停止。
这个想法的麻烦是,我只有在DataContext中做选择导致问题。 (我有插入发生在不同的数据库/ DataContexts。)我也没有明确的交易。这让我有些沮丧:查询行为看起来就像是一个死锁,但是我从来没有发生过一种并非由于某种事务隔离问题而导致的死锁 - 而且在这里看起来并不像这种情况(无论如何乍一看)。
我正在寻找关于如何调试此问题的建议。我应该考虑什么样的事情来确定造成这个问题的原因?
编辑
的一些注意事项,可能是有用的:
- 我对查询一个观点,即引用:
- 在同一个数据库
- 别名指向其他意见另一个数据库中的表通过链接服务器。
- 这种观点是使用
union
加入几个查询的结果一起
EPILOGUE
我结束了由返工我的查询固定的核心问题。原来不止一次地调用了几张表格(通过不同的观点)。重做版本绕过了所有这些,超时消失。
当你说'我在SQL Management Studio中运行等价的SQL'时,你的意思是你是从调试输出中复制LINQ生成的实际sql吗? 另外:因为您有权访问数据库,您是否能够隔离并监视在活动监视器中运行的实际流程? – 2010-03-10 20:14:04
您是否在发生问题的同时运行了SQL Profiler? – 2010-03-10 20:18:14
@E Rolnicki:是的,从LINQ获取实际的SQL。 – 2010-03-10 20:41:16