存储过程是否在“执行超时到期”(VB.Net)上完成?

时间:2018-11-06 07:42:52

标签: sql-server vb.net

所以我在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;

在日志表的最后,我同时具有“开始”和“完成”两个条目。

1 个答案:

答案 0 :(得分:1)

发送到服务器后,您的存储过程将一直执行到完成,除非取消。

如果您的客户端应用程序遇到命令超时,它将通知SQL Server取消操作。

应该回滚所有更改,但是我实际上不希望不检查就依赖此行为,因为实际发生的情况取决于其他一些设置,例如XACT_ABORT

这是一个非常详细的解释。

https://blogs.msdn.microsoft.com/khen1234/2005/10/20/theres-no-such-thing-as-a-query-timeout/

需要注意的是,客户端超时时停止命令实际上是客户端发送的另一命令。严格来说,它是一个客户端构造,与服务器上发生的任何事情无关。服务器上的任何内容实际上都没有超时。

如果一切正常,则客户端超时应该停止命令,并根据配置和命令,更改回滚。

但是,如果发生坏事而实际上在客户端发送取消命令(电源故障,不礼貌的重启等)之前使客户端断开连接,则执行将一直持续到完成。