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

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

SqlCommand.Timeout = 30; 

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

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

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

…至少这是我可以使用SQL Servervalidation的行为…

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

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

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

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

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