假设 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 是可选的)。