停止Microsoft SQL Server实例时,如何运行查询?

考虑到MS SQL Server实例正在执行长时间运行的查询,服务将通过services.msc停止,或者像实际发生的那样 – 由于服务器位于正在经历滚动停电的发展中国家的UPS而触发的系统closures。

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

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

理想情况下,我正在寻找一个权威来源(微软文档)作为答案,因为我怀疑不同的行为取决于我未知的一个因素。 即有时我们看到查询回滚,有时我们看到他们完成。 也许该服务打了一个电话,说明交易有多远,是否回滚或完成的速度更快。

如果它有所不同,这是SQL 2012。

提前致谢!

这取决于您是否使用NOWAITclosures服务器。

来自MSDN :

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

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

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

至于closuresNOWAIT:

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

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