SubmitChanges()上的LINQ to Entities超时

时间:2012-06-29 19:16:47

标签: asp.net sql-server database concurrency linq-to-entities

在数据上下文中调用SubmitChanges()时,我遇到了以下异常的问题:

“超时已过期。操作完成前经过的超时时间或服务器没有响应。语句已终止。”

这发生在由5-100个并发用户使用的ASP.NET Web应用程序上。请注意,增加站点/数据库的超时时间没有帮助,并且运行的查询非常简单快速。我已经完全删除了超时期限,导致网站在发生错误时无限期挂起。

此问题的其他方面:

  • 它是间歇性的,无法可靠再现
  • 它只发生在几种不同的方法中,而不是任何其他方法
  • 增加或删除超时期限无济于事
  • 重新启动服务器并重新启动MSSQL数据库没有帮助

这似乎可能是并发/死锁问题,但我不知道如何调试或修复它。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

当应用程序执行数据库操作并等待SubmitChanges的响应时,尝试在Sqlserver中运行以下查询

**sp_who2**

查看返回输出中的Blkby列。 如果找到一行具有某个值(这是阻止连接的命令的SPID)。

检查该列中的ProgramName以查找更多信息。

如果您发现所描述的阻止的SPID,则运行以下命令以查找在该SPID上执行的最后一个查询。 说Blkby的价值是59

**dbcc inputbuffer(59)**

这将使查询阻止您的应用程序查询。

这是解决问题的一种方法。

有时由于存储过程中的默认值参数导致参数嗅探而发生超时。

在这种情况下,您可以尝试使用该行作为使用过程中的第一行

设置ARITHABORT ON

更改程序并再次尝试数据库操作。

如果有效,您可以在之后删除此行,然后再次更改程序。

如果适合您,请尝试此操作。

我在这里找到了类似的问题

还可以在此处阅读有关在Web应用程序中运行缓慢且在SSMS中立即运行的更多信息

Stored procedure slow when called from web, fast from Management Studio

希望它有所帮助。