【问题标题】:SQL Server timeout while executing stored procedure执行存储过程时 SQL Server 超时
【发布时间】:2012-04-27 11:03:35
【问题描述】:

我遇到了一个问题,即执行存储过程来更新表中的记录会导致超时错误。我最初从 MVC3 应用程序中调用我的存储过程,这是我第一次注意到错误的地方。

但是,使用 SQL Server Profiler,我能够复制 ADO.NET 生成的代码并直接在数据库上运行它。我让这个查询运行了大约 5 分钟,但它仍然没有返回任何内容。

以下是一些事实:

  1. 存储过程有大约 100 个要传递给它的参数。

  2. 我的 MVC 应用程序、SSMS 和 Sql Server 2008 都安装在同一台机器上。

  3. 存储过程尝试更新包含大约 5000 个条目的表中的单行。

  4. 有一个触发器可以更新 LastModifiedDateCreatedDate,但我删除了这些触发器,并更新了 EDMX 以确定这些触发器是否导致了无限循环。

  5. 我们的实时服务器运行与我尝试运行的存储过程完全相同的存储过程(使用经典 asp)并获得正确的结果。此外,实时服务器无法在 .NET 下运行相同的存储过程

  6. 我的机器无法运行经典 ASP 和 ASP.NET 的存储过程

  7. 存储过程似乎只对少数几行失败,而其他行运行良好。

  8. 我已尝试更改传递给存储过程的参数值

  9. 其他存储过程工作正常

  10. 存储过程试图更新的特定表似乎存在锁定,因为执行其他查询工作正常,即使在等待执行此查询时也是如此。

如果有人对我可以执行的任何其他测试有任何想法,或者我可以使用任何工具来确定超时错误的根本原因。

谢谢。

附:不要告诉我更改命令超时属性,我已经尝试将其设置为零!

【问题讨论】:

  • 我对表格有同样的问题,其中列类型是hierarchyid。
  • "存储过程有大约 100 个参数传递给它。"哦哦?!?无法想象一个过程会得到 100 个参数而不违反单一责任原则的情况。
  • 一个存储过程更新一个有 100 列的表中的一行呢?
  • ^ 有 100 列,我可能会将其作为逗号分隔格式的单个参数发送。

标签: sql-server ado.net timeout command-timeout


【解决方案1】:

我能想到两件事:

  1. 我假设您已经在存储过程中实现了异常处理。如果没有,请这样做,并尝试先掌握问题陈述。当你说,它发生在 一些 行,可能是由于 bad 数据?阅读this,了解如何在SQL Server 2008中进行异常处理

  2. 你试过找出是否有死锁吗? 请阅读this了解详细过程和理解。

【讨论】:

  • 谢谢,我现在就研究一下这些资源。我不知道 SQL 处理异常
  • 我将死锁图事件添加到 Sql Server Profiler,但我没有收到该事件。有什么我想念的吗?我删除了批处理完成和批处理启动事件类并添加了死锁图事件。我现在已经离开存储过程 2 分钟,但什么都没有出现。这是否意味着 SQL Server 无法检测到任何死锁?此外,我刚刚检查了日志,在其中找不到任何相关条目。
  • 您是否第一次尝试捕获异常?在那里发现什么?您是否可以发布一些代码以更好地理解?
  • 我不能发布它,但它是一个相当标准的存储过程。它检查输入参数之一的值是否为 01/01/1900。如果是,则将参数设置为空。然后它会检查是否有此客户的任何许可证信息。如果不是,它将一些许可证信息插入到表 X 中。然后继续更新表 Y。如果客户的活动值不是“Z”,则更新表 Y 的活动字段
猜你喜欢
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2020-05-21
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多