我想了解Server的以下行为:
SQL版本:
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64)
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
让我们假设存储过程如下(为了简洁起见省略了一些代码):
CREATE PROCEDURE Test
AS
BEGIN TRY
INSERT INTO test_log ('Stage 1. PROC started')
...
EXEC (@ScheduledProcedure) -- Execution of this takes 8-10 mins
INSERT INTO test_log ('Stage 2. Scheduled Procedure completed')
END TRY
BEGIN CATCH
...
END CATCH;
INSERT INTO test_log ('Stage 3. PROC Completed')
我已经做了一些测试,以检查当我的过程仍在运行时关闭SQL Server时,我的过程会发生什么,下面是结果:
有人能试着解释一下Server的行为吗?
发布于 2017-05-16 09:54:33
当我转到services.msc并停止Server时,服务将处于“停止”状态,直到@ScheduledProcedure完成为止(8-10分钟)。
您所看到的是关闭Server时的默认行为。如果不想等待,可以使用WITH NOWAIT
开关,但当SQL server启动时,恢复时间将更长,因为事务必须前滚和回滚。
详细信息这里。
除非使用WITHNOWAIT选项,否则通过以下方式关闭Server:
当我关闭操作系统时,SQL服务似乎取消了存储过程。我认为是这样的,因为第2阶段和第3阶段的消息在test_log表中不可用。
在这种情况下,Server没有控制,因为操作系统发出关闭进程命令,这就是为什么您将看到已完成并写入事务日志但尚未应用于数据库的立即shutdown.Transactions将应用于数据库。再次回滚打开、未完成的事务,以确保数据库处于一致状态。有关前滚和回滚这里的详细信息。
关闭Server的不同方法。
发布于 2017-05-16 09:36:29
当您停止SQL服务时,SQL Server
将等待sp完成。
当您关闭Windows时,SQL Server
将执行检查点,并在重新启动回滚后执行未提交事务。
https://dba.stackexchange.com/questions/173677
复制相似问题