在SqlCommand.ExecuteNonQuery
到期后,由客户端C#程序对CommandTimeout
方法的调用所启动的SQL Server存储过程会发生什么?
- SQL Server是否继续运行存储过程以完成操作(即使客户端放弃了等待结果的时间)?
- SQL Server是否会停止执行该sproc,但是存储过程到目前为止所做的任何更改都会保留吗?
- SQL Server是否停止执行该存储过程,并回滚所做的所有更改?
- 这取决于吗? (如果是这样,在什么地方?)
以一个特定的示例为例:考虑以下(简化)代码段,该代码段由调度程序每天晚上运行一次,并调用特定的存储过程,该过程从非常大的数据库中清除了大量的过时的数据库记录表格:
SqlConnection connection = new SqlConnection(_myConnectionStringToSqlServer);
using (SqlCommand command = Connection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "MyLongRunningCleanupOldRecordsStoredProcedure";
command.CommandTimeout = 600; // 10 minutes
command.ExecuteNonQuery();
}
如果在配置的10分钟超时时间之后,SQL Server实例仍仅在运行MyLongRunningCleanupOldRecordsStoredProcedure
sproc的途中,并且客户端程序超时并引发异常,那么此时数据库的行为是什么? ? (它会继续完成存储过程的运行并清理剩余的记录吗?是否已经回滚了已清理的所有记录?)