SQL Server更新作业超计划运行时长未完成,会出现何种情况?
SQL Server作业超时后的行为说明
先给你明确结论:SQL Server Agent作业本身不会自动掐断超时任务,具体行为完全看你怎么配置:
- 要是你只设置了作业每日早间启动,没给作业步骤加超时限制:那这个UPDATE会一直跑,直到所有符合条件的行更新完成,或者中途遇到数据库错误才会停,完全不受你预想的3小时限制。
- 要是你在作业步骤的属性里设了超时时间(比如把3小时转换成10800秒填进去):一旦步骤运行超了这个时间,SQL Server Agent会直接终止这个步骤的进程,此时你的UPDATE会被回滚(默认是隐式事务,除非你手动拆分了事务),作业会被标记为失败,后续如果有其他步骤也不会执行。
- 要是你用外部工具(比如Windows任务计划)触发脚本,还设了任务超时终止:那外部进程会强制杀掉SQL的会话,同样UPDATE会回滚,任务直接失败。
另外给你个生产环境的实用建议:别直接跑全表UPDATE,改成分批更新,这样就算中途被中断,下次能接着上次的进度来,不会白跑。给个简单示例:
WHILE 1=1 BEGIN -- 每次更新10000行,可根据你的服务器性能调整数值 UPDATE TOP(10000) [你的目标表] SET [要更新的列] = 新值 WHERE [更新条件] AND [未更新标识] -- 比如加个IsUpdated=0,或者按主键范围筛选未更新的行 -- 当没有行可更新时退出循环 IF @@ROWCOUNT = 0 BREAK -- 可选:加个短暂延迟,降低服务器IO压力 WAITFOR DELAY '00:00:01' END
你还可以在作业里加个进度记录表,每次执行完一批就记下当前的最大主键值,下次启动时直接从这个值往后更,彻底避免重复操作。
内容的提问来源于stack exchange,提问作者Sherwin Moodley
相关产品推荐
相关产品推荐

