SQL 过程超时
Posted
技术标签:
【中文标题】SQL 过程超时【英文标题】:Timeout expired for SQL Procedure 【发布时间】:2019-10-16 06:56:45 【问题描述】:当更多的人在 . net 应用程序,它显示超时错误。
超时。操作完成前超时时间已过或服务器没有响应
有时它也会显示
事务(进程 ID 179)与另一个进程在锁定资源上死锁,并已被选为死锁牺牲品。重新运行事务。
我们增加了连接超时和连接池大小,但问题仍然存在。该过程是用事务编写的。
我该如何解决这个问题? 在开发环境中重现错误的任何指针也会有所帮助
【问题讨论】:
您使用的是哪个 dbms? (这个问题不完全是关于 SQL...) 尝试增加 commandTimeout 也 MS SQL server 2016。当我从 C# 代码调用该过程时,我收到了这些错误。 C#代码为DataSet updtDs = Helper.ExecuteDataset(cn, "GS_MGS_SaveMyGoalSheet", CommandType.StoredProcedure, null, parameterValues); 当连接 A 试图获取 另一个 连接 B 持有的行或表上的更新锁时,会发生死锁,该连接 B 也想锁定 A 持有的行。这与超时无关。这意味着查询将过多的锁保持太久。在大多数情况下,您可以通过使用 SNAPSHOT 隔离来绕过该问题,但这并不能解决实际的查询问题 【参考方案1】:运行this query 以获取死锁报告。这将有助于识别导致死锁的查询和资源。
死锁和超时通常是需要查询和/或索引调整(锁定比需要更多的行)或正在使用限制性隔离级别 (SERIALIZABLE
) 的症状(持有更粗粒度的锁更长的时间)。检查执行计划以确保触及最少的行。
确保存储过程包含SET XACT_ABORT ON
。这将确保由 proc 代码启动的显式事务在发生超时时立即回滚。否则,超时后,带有打开事务的连接将返回到连接池并且不会回滚,直到连接被重用和重置,或者由于不活动而被连接池物理关闭。
【讨论】:
以上是关于SQL 过程超时的主要内容,如果未能解决你的问题,请参考以下文章
调用 SQL Server 存储过程的 SqlCommand 超时