停止 Microsoft SQL Server 实例时正在运行的查询会发生什么?

停止 Microsoft SQL Server 实例时正在运行的查询会发生什么?

假设 MS SQL Server 实例正在执行一个长时间运行的查询,该服务通过 services.msc 停止,或者 - 实际发生时 - 由于服务器位于经历轮流停电的发展中国家,因此由 UPS 触发系统关闭。

发生这种情况时,服务会在一段时间内保持“停止”状态,并且该过程的 CPU 和磁盘 I/O 仍然很高。

正在运行的查询会发生什么情况?它们是否允许在服务进入“已停止”状态之前完成,还是被取消并回滚?

理想情况下,我正在寻找一个权威来源(Microsoft 文档)作为答案,因为我怀疑不同的行为取决于我不知道的因素。例如,有时我们会看到查询回滚,有时我们会看到它们完成。也许服务会调用事务的进展情况以及回滚或完成是否更快。

如果有什么区别的话,这就是 SQL 2012。

提前致谢!

答案1

这取决于您是否使用 NOWAIT 关闭服务器。

微软

除非使用 WITH NOWAIT 选项,否则 SHUTDOWN 将通过以下方式关闭 SQL Server:

  • 禁用登录(sysadmin 和 serveradmin 固定服务器角色的成员除外)。
  • 等待当前正在运行的 Transact-SQL 语句或存储过程完成。要显示所有活动进程和锁的列表,请分别运行 sp_who 和 sp_lock。
  • 在每个数据库中插入一个检查点。

使用 SHUTDOWN 语句可最大限度地减少 sysadmin 固定服务器角色成员重新启动 SQL Server 时所需的自动恢复工作量。

至于立即关闭:

可选。关闭 SQL Server 而不在每个数据库中执行检查点。SQL Server 在尝试终止所有用户进程后退出。服务器重新启动时,将对未完成的事务进行回滚操作。

默认是等待当前正在运行的事务完成(NOWAIT 是可选的)。

相关内容