c# - 客户端程序的 SqlCommand.ExecuteNonQuery() CommandTimeout 过期后,SQL Server 是否继续运行存储过程?
问题描述
过期后由客户端 C# 程序调用该SqlCommand.ExecuteNonQuery
方法启动的 SQL Server 存储过程会发生什么情况CommandTimeout
?
- SQL Server 是否继续运行存储过程直到完成(即使客户端放弃等待结果)?
- SQL Server 是否停止执行存储过程,但存储过程在此之前所做的任何更改仍然存在?
- 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();
}
如果 SQL Server 实例在配置的 10 分钟超时时间之后仍然只是运行存储过程的中途MyLongRunningCleanupOldRecordsStoredProcedure
,并且客户端程序超时并抛出异常,那么此时数据库的行为是什么?(它是否继续完成运行存储过程并清理剩余的记录?是否有任何已清理的记录回滚?)
解决方案
推荐阅读
- python - InvoiceYearMonth 中的 KeyError。在 Pycharm 的 Jupyter Notebooks 中上面编写的代码中运行良好
- calendar - 如何将primeNg日历“区域设置”用于多个值或动态并自动更改firstdate?
- c# - 会话超时到期时如何运行自定义代码
- bdd - Jbehave with gradle
- pycharm - PyCharm 导入的模块显示红色程序虽然有效
- javascript - 组件标签内的三元运算符
- javascript - Javascript - 将嵌套对象中的所有值设置为 null
- json - 有没有办法在 AWS Athena 中展平结构字段?
- java - 我想使用 volley 将 base64 图像字符串发送到 Url
- laravel - 表单上的 Laravel 验证器并发送帖子