代码之家  ›  专栏  ›  技术社区  ›  RoboDev

存储过程和sqlcommand超时

  •  6
  • RoboDev  · 技术社区  · 15 年前

    如果我使用sqlcommand运行存储过程,并且sqlcommand超时,那么stored proc是否继续执行,或者在sqlcommand断开连接时强制退出?

    2 回复  |  直到 15 年前
        1
  •  3
  •   brendan    15 年前

    我的直觉告诉我这个过程仍然可以执行,所以我做了一个简单的测试。

    SQL:

    Create Procedure TestDelay
    AS
    
    waitfor delay '00:00:40'
    
    update table_1
    set dt = getdate()
    

    在vb.net中(为此目的与c相同):

        Dim con As New SqlConnection(myconnectionstring)
        Dim com As New SqlCommand("TestDelay", con)
        com.CommandType = CommandType.StoredProcedure
        con.Open()
        Try
            com.ExecuteNonQuery()
        Catch ex As Exception
            con.Close()
            Response.Write(ex.Message)
        End Try
    

    结果如何? 该过程在超时后没有完成。 我检查了在SQL事件探查器中跟踪期间发生的情况,并确定有足够多的SQL将调用包装到事务中,并且必须在超时时回滚该事务。

    注意:此测试是针对SQL 2005运行的,但我怀疑其他版本中的结果类似。

        2
  •  1
  •   Community CDub    8 年前

    正如Brendan所说,客户机发送一个“中止”并停止处理。就这么简单。

    然而,它比那更复杂…

    默认情况下,任何事务都不会回滚,只有在连接关闭之前,锁才会留在那里。如果返回到连接池并重新使用,则 算作结束。

    这就是为什么 SET XACT_ABORT ON (其他问题 SO1 , SO2 )建议