假设我使用 C# 运行一个长时间运行的 SQL Server 存储过程(比如说 30 分钟)。进一步假设我在 C# 中的查询上设置了 1 小时的超时时间,这样无论出于何种原因,这个 SP 花费的时间比预期的要长,我最终不会垄断数据库。最后,假设这个存储过程中有一个 try/catch 块来捕获错误并在其中的任何步骤失败时进行一些清理。
一些代码(C#):
using (SqlCommand comm = new SqlCommand("longrunningstoredproc"))
{
comm.Connection = conn;
comm.CommandType = CommandType.StoredProcedure;
comm.CommandTimeout = 3600;
comm.ExecuteNonQuery();
}
/* Note: no transaction is used here, the transactions are inside the stored proc itself. */
T-SQL(基本上相当于以下):
BEGIN TRY
-- initiailize by inserting some rows into a working table somewhere
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
-- etc.
-- remove the rows from the working table (and set another data point to success)
END TRY
BEGIN CATCH
-- remove the rows from the working table (but don't set the other data point to success)
END CATCH
我的问题是,当命令从 C# 端超时时,SQL Server 将如何处理查询?它会调用 SP 的 catch 块,还是会完全切断它,以便我需要在 C# 代码中执行清理?