存储过程和SqlCommand超时

时间:2009-11-11 14:46:01

标签: c# sql sql-server timeout sqlcommand

如果我使用SqlCommand运行存储过程并且SqlCommand超时,StoredProc会继续执行还是在SqlCommand断开连接时强行退出?

2 个答案:

答案 0 :(得分:3)

我的直觉说程序仍然会执行,所以我把一个简单的测试组合在一起。

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似乎在事务中包装了该调用,并且必须在超时时回滚该事务。 / p>

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

答案 1 :(得分:1)

正如brendan所说,客户端发送“中止”并且处理停止。就这么简单。

然而,它比那更复杂......

默认情况下,任何事务都不会回滚,只有连接关闭才会保留锁定。如果返回到连接池并重新使用,则此不会计为关闭。

这就是推荐SET XACT_ABORT ON(其他问题SO1SO2)的原因