Execution Timeout Expired - 随机用于简单的更新命令
Posted
技术标签:
【中文标题】Execution Timeout Expired - 随机用于简单的更新命令【英文标题】:Execution Timeout Expired - Randomly for simple update command 【发布时间】:2017-12-01 17:41:45 【问题描述】:我使用实体框架 (EF6) 随机收到执行超时过期错误。在执行以下更新命令时,它会随机给出执行超时错误。
UPDATE [dbo].[EmployeeTable] SET [Name]=@0,[JoiningDate]=@1 WHERE ([EmpId]=@2)
上面的更新命令很简单,更新EmployeeTable需要2-5秒。但有时相同的更新查询需要 40-50 秒并导致错误为
执行超时已过期。超时时间过去之前 操作完成或服务器没有响应。这 语句已终止
.
为此,我在 MyApplicationContext 类的构造函数中更新了代码,可以将其更改为包含以下属性
this.Database.CommandTimeout = 180;
上面的命令应该可以解决我的超时问题。但我找不到那个问题的根本原因。
据我了解,此类超时问题可能有三个原因;
-
某处出现了僵局
数据库的统计信息和/或查询计划缓存不正确
查询太复杂,需要调优
你能告诉我这个错误的主要原因是什么吗?
【问题讨论】:
您对此有什么解决方案吗?我也面临类似的问题。 不,我认为是实体框架 dll 中的问题。 我通过删除 .net Transactions 得到了一个解决方法.. 它运行良好.. @Abi,你能解释更多细节吗? 我在 .Net 中使用事务以及 EF 进行 SQL 更新操作.. 并得到超时异常.. 当我删除事务时它已解决.. 希望现在清楚。 【参考方案1】:这个查询:
UPDATE [dbo].[EmployeeTable]
SET [Name] = @0,
[JoiningDate] = @1
WHERE ([EmpId]=@2);
通常不应花费 2 秒。它(可能)更新单行,这不是一个 2 秒的操作,即使在一个非常大的表上也是如此。你有EmployeeTable(EmpId)
的索引吗?如果不是,那将解释 2 秒以及潜在的死锁。
如果您确实有索引,这可能是其他事情。一个地方是查找表上的任何触发器。
【讨论】:
谢谢@Gordon,我在 EmployeeTable 上有一个索引。但我在那张桌子上没有任何触发器。一件事是这个问题只发生在生产数据库上,而不是在 DEV 或 QA 数据库上。【参考方案2】:如果它是随机的,那么当您的应用程序更新行时,可能有其他东西正在访问数据库。
我们遇到了同样的问题。在我们的案例中,根本原因是 BO 报告正在生产数据库上运行。这些报告会锁定行并导致我们的应用程序超时(因为这些报告是按需执行的,所以随机发生)。
您可能要检查的其他事项:
您的桌子上有复杂的触发器吗? 表中使用的所有外键是否都在外表中编入索引?【讨论】:
以上是关于Execution Timeout Expired - 随机用于简单的更新命令的主要内容,如果未能解决你的问题,请参考以下文章
Rails Mailer “Net::OpenTimeout: execution expired” 仅在生产服务器上出现异常
偶尔出现SqlException: Timeout expired
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool
navigator.geolocation.getCurrentPosition 总是得到错误代码 3: timeout expired