在我目前管理的大约 50 个实例中,我有两个几乎每晚都有一个死锁,涉及“INSERT INTO msdb.dbo.sysjobhistory”(始终是受害者)和由“EXEC”调用的“DELETE FROM msdb.dbo.sysjobhistory” msdb.dbo.sp_purge_jobhistory”,这两个会话都由 SQL Server 代理服务帐户运行。我从来没有在任何其他情况下遇到过这样的僵局,也没有在任何以前的工作中遇到过这样的僵局。在每台服务器中,死锁发生在夜间的不同时间(sp_purge_jobhistory 每周计划运行的周六 1:30 或 syspolicy_purge_history 的夜间计划中的每一步运行的 2:01)。
这两个“问题”实例与其他任何实例之间似乎没有任何明显不同。一个是 2012 SP3 CU3 测试服务器,另一个是 2012 SP2 生产实例。
关于如何防止这种情况的任何想法?
我写了这个(他链接到的@Taiob 的博客文章中代码的简化版本),然后从工作而不是 Microsoft 提供的 sp_purge_jobhistory 中调用它:
它将我们从 msdb.dbo.sysjobhistory 中超过 100 万行减少到只有大约 1/4,并且删除不再涉及死锁。
感谢@Taiob 和@ScottHodgin 的投入!