如果我使用 SqlCommand 运行存储过程并且 SqlCommand 超时,StoredProc 会继续执行还是在 SqlCommand 断开连接时强制退出?
问问题
2281 次
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
(其他问题SO1,SO2)被推荐的原因
于 2009-11-11T19:29:46.447 回答