考虑一个存储过程,它可以在不使用事务的情况下在60秒内更新一些行。我们将ADO.NET的SqlCommand.Timeout设置为30秒。ADO.NET的SqlCommand.CommandTimeout如何工作?
SqlCommand.Timeout = 30;
当超时发生在30秒时,存储过程是否会继续在数据库服务器中运行?服务器如何与客户端进行通信?
考虑一个存储过程,它可以在不使用事务的情况下在60秒内更新一些行。我们将ADO.NET的SqlCommand.Timeout设置为30秒。ADO.NET的SqlCommand.CommandTimeout如何工作?
SqlCommand.Timeout = 30;
当超时发生在30秒时,存储过程是否会继续在数据库服务器中运行?服务器如何与客户端进行通信?
如果你还没有关闭你的SQL连接,它应该继续运行,如果它已经开始执行。 (你应该可以测试&对此比较容易验证。)
答案是否定的,你在服务器上的尝试操作将在30秒后失败,你的SqlCommand对象会在你的代码中抛出一个异常(下面)存储过程事务将回滚。
超时已过期。操作完成之前超时的时间或服务器没有响应。
...至少这是我可以验证使用SQL Server我想知道完全相同的行为......
。我找不到答案,但做了一些试验,看起来好像发送了某种取消查询:
我知道这是一个五岁的岗位,但如果我来到这里,其他人也:-)
顺便说一句,在ado.net,以增加你的超时时间,你必须在sqlcommand和sqlconnection中增加,第一个的默认值是15秒,第二个30秒。所以如果你只是将sqlcommand改为60秒,它将在30秒后仍然超时,这可能会令人费解。
这里特殊的是“隐式交易”。所有sql命令(至少每一个都是IMPLICIT事务的AUTOAMTICALLY部分),即使没有显式设置事务。 – TomTom 2010-08-01 21:58:44
这个异常是一个明确的事务,除非SET XACT_ABORT ON被设置 - 直到连接本身关闭,否则这个事务根本不会回滚并保持打开/未提交状态。在连接池中,这可能永远不会发生(下一个命令可能会在事务的上下文中运行?不确定但是存在风险) – urbanhusky 2015-06-26 09:48:30