所以我在VB.Net中有一个名义上的System.Data.IDbCommand
,正在执行一个存储过程。三十秒(默认超时{System.Data.IDbCommand
)后,应用程序将运行“执行超时已过期”异常。到目前为止,一切对我都很好。
在存储过程的开始和末尾是对日志表的插入。日志表中的这两个条目均已完成,这使我相信即使在遇到超时后,存储过程仍会完成。
我找到了一个相关的帖子,但是那里的答案对我来说不是很清楚: Stored Procedure and Timeout
根据这篇文章,sql本身没有超时: Handling Timeouts inside stored procedures
即使我在VB .Net中收到超时,存储过程在服务器上是否也会完成?在存储过程中(在VB.Net中也没有)没有定义事务,并且try-catch不会引发任何错误(可能是因为sql-server本身没有超时-仅是VB.Net连接/命令)。>
以下是存储过程的示例:
ALTER PROCEDURE [dbo].[sp_Whatever] AS BEGIN
--Does get logged
INSERT INTO [dbo].[T_Log](Message)
SELECT 'Started'
BEGIN TRY
SET NOCOUNT ON;
--To provoke a Timeout
WAITFOR DELAY '00:01'
END TRY
BEGIN CATCH
--Does not get logged (=no error here)
INSERT INTO [dbo].[T_Log](Message)
SELECT 'Error'
END CATCH;
--Does get logged
INSERT INTO [dbo].[T_Log](Message)
SELECT 'Finished'
END;
在日志表的最后,我同时具有“开始”和“完成”两个条目。
答案 0 :(得分:1)
发送到服务器后,您的存储过程将一直执行到完成,除非取消。
如果您的客户端应用程序遇到命令超时,它将通知SQL Server取消操作。
此应该回滚所有更改,但是我实际上不希望不检查就依赖此行为,因为实际发生的情况取决于其他一些设置,例如XACT_ABORT
这是一个非常详细的解释。
https://blogs.msdn.microsoft.com/khen1234/2005/10/20/theres-no-such-thing-as-a-query-timeout/
需要注意的是,客户端超时时停止命令实际上是客户端发送的另一命令。严格来说,它是一个客户端构造,与服务器上发生的任何事情无关。服务器上的任何内容实际上都没有超时。
如果一切正常,则客户端超时应该停止命令,并根据配置和命令,更改应回滚。
但是,如果发生坏事而实际上在客户端发送取消命令(电源故障,不礼貌的重启等)之前使客户端断开连接,则执行将一直持续到完成。