ADO.NET的SqlCommand.CommandTimeout如何工作?

时间:2010-07-30 17:25:09

标签: c# ado.net timeout

考虑一个存储过程,该过程在60秒内更新某些行而不使用事务。我们将ADO.NET的SqlCommand.Timeout设置为30秒。

SqlCommand.Timeout = 30;

当超时发生在30秒时,存储过程是否会继续在数据库服务器中运行?服务器如何将此信息传达给客户端?

3 个答案:

答案 0 :(得分:6)

答案是否定的,您在服务器上尝试的操作将在30秒后失败,您的SqlCommand对象将在您的代码中抛出异常(如下所示),并且隐式存储过程事务将回滚。

超时已过期。操作完成之前经过的超时时间或服务器没有响应。

...至少这是我可以使用SQL Server验证的行为......

答案 1 :(得分:1)

我想知道完全一样。我找不到答案,但做了一些实验,看起来像某种取消查询发送:

  • 如果涉及触发器或表已锁定,则不会更新。
  • 如果有多个语句,而不是在事务中,它将在超时发生后取消。已完成的工作仍然完成。
  • 如果您在插入之前添加延迟,则表格中不会有任何内容。
  • 如果在插入后添加延迟,则插入内容将写入您的表格。

我知道这是一个五岁的帖子,但如果我到这里,其他人也会: - )

顺便说一句,在ado.net中,为了增加你的超时,你必须增加sqlcommand和sqlconnection,第一个的默认值是15秒,第二个30秒。因此,如果您只是将sqlcommand更改为60秒,它将在30秒后仍然超时,这可能相当令人费解。

答案 2 :(得分:0)

如果您还没有关闭SQL连接,它应该继续运行,如果它已经开始执行proc。 (您应该能够相对轻松地测试和验证这一点。)