6

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

4

2 回答 2

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

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

于 2009-11-11T15:20:33.827 回答
1

正如布伦丹所说,客户端发送“中止”并且处理停止。就如此容易。

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

默认情况下,任何事务都不会回滚,并且锁会一直保留在那里,直到连接关闭。如果返回到连接池并重用,那么这不算关闭。

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

于 2009-11-11T19:29:46.447 回答