如果我使用SqlCommand运行存储过程并且SqlCommand超时,StoredProc会继续执行还是在SqlCommand断开连接时强行退出?
答案 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
(其他问题SO1,SO2)的原因