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 - 随机用于简单的更新命令的主要内容,如果未能解决你的问题,请参考以下文章

连接池和 "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

TCP Provider The semaphore timeout period has expired